2010-02-07 143 views
6

我有一个项目正在使用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,然后在常规模式下似乎再次松动并重新工作,不知道发生了什么。

回答

1

就是这个样子

静态库编译,动态库在运行时加载,但只有那些符号被丢失(我认为)。你可以编译共享库,然后你可能会遇到符号冲突。

因此,opencv使用已编译的符号,因为它们已经存在,而不是来自动态库的符号。你最终会使用静态符号,可能有不同的签名,来自opencv的预期。

+0

我的假设是,它正在使用一个或其他库,但也许它使用了一点两种?更改openCV编译的头文件并没有解决问题。 – 2010-02-07 17:01:58

1

一般来说,链接器可以传递所有解析相同符号的多个库。它只是使用它找到的第一个。链接器命令行上库的顺序将决定哪一个“获胜”。

顺便说一句,这是不正确的对象文件。我曾经使用过的每一个链接器都假设你想要使用你指定的所有对象,并且如果多于一个具有相同的符号,就会抱怨。

+0

因此,最有可能的是,libjpeg的一个或另一个版本会“赢”吗?所以要么选择openCV版本,在这种情况下,事情会起作用,或者在编译期间将openCV使用的头部切换到freeimage,应该修复它...但它不= =( – 2010-02-07 17:09:56

+0

如果链接器选择的那个是不同于你使用的头文件,那么我会期望它不工作,你需要切换头文件_并且还要重新排列链接线上的库文件,甚至是求偶失败,最好是把你不想要的库文件完全使用链接线 – 2010-02-07 20:02:14