我有一个项目正在使用FreeImage和openCV,目前我们正在使用这两个jpeg支持(我正在努力解决这个问题,但现在它必须留下来)。无论如何,FreeImage将libjpeg 7.0编译到它的静态库中,而openCV的highgui库将它作为共享库(在我的系统上,Ubuntu 9,我已经安装了libjpeg 6.2)链接它。静态和共享库符号冲突?
它们链接到一个最终的库,用于链接到各种程序,java包装等。所有这些工作正常,没有符号冲突或任何在编译/链接时间。但是,当我使用openCV cvLoadImage函数打开图像时,它在读取标题时就会消失,很可能是由于6.2和7.0中的标题之间的差异。
如果我取消FreeImage的链接(并注释掉需要它的代码),openCV调用会再次开始工作,因此FreeImage的静态libjpeg符号与libjpeg共享库中将要加载的符号冲突。我无法弄清楚为什么我的编译器在链接过程中不会因为两组libjpeg符号而引发错误。另外,我试着用7.0版暂时替换我的系统的jpeglib.h头文件,看看用它编译的openCV是否会与freeimage带给表格的符号同步,看起来无济于事。
最后,我在jpeg_read_header中放置了freeimage编译的libjpeg中的printf,并重新构建它以查看openCV是否使用freeimage libjpeg定义。它没有打印出来,所以我不得不假设没有。
所以我想我的问题是
1)为什么不链接一个静态的libjpeg和共享的libjpeg生成链接因为重复的符号错误?
2)有谁知道为什么这两件事情彼此冲突?
编辑:在调试模式下编译openCV,然后在常规模式下似乎再次松动并重新工作,不知道发生了什么。
我的假设是,它正在使用一个或其他库,但也许它使用了一点两种?更改openCV编译的头文件并没有解决问题。 – 2010-02-07 17:01:58