我正在处理一个使用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头文件,看看是否可以使与freeimage提供的符号同步的openCV编译,但似乎没有成功。
最后,我在freeimage编译的libjpeg的jpeg_read_header中放置了一个printf,并重新构建它,以查看openCV是否使用freeimage libjpeg定义。它没有打印出来,所以我必须假设没有。
所以我的问题是:
1)为什么连接静态libjpeg和共享的libjpeg不会生成由于重复符号而导致的链接错误?
2)有人知道为什么这两个东西会相互冲突吗?
编辑:以调试模式编译openCV,然后再次以常规模式编译似乎已经解决了问题,不知道发生了什么事。
它们链接到最终库中,用于链接到各种程序、Java包装器等。所有这些工作都很好,在编译/链接时没有符号冲突或任何问题。然而,当我尝试使用openCV cvLoadImage函数打开图像时,它在读取标头时崩溃了,很可能是由于6.2和7.0之间标头的差异所致。
如果我取消连接FreeImage(并注释掉需要它的代码),则openCV调用开始重新工作,因此显然FreeImage的静态libjpeg符号与从libjpeg共享库加载的符号发生冲突。我无法弄清楚的是,为什么我的编译器在链接时没有因两组libjpeg符号而抛出错误。此外,我已经尝试暂时使用7.0版本替换系统的jpeglib.h头文件,看看是否可以使与freeimage提供的符号同步的openCV编译,但似乎没有成功。
最后,我在freeimage编译的libjpeg的jpeg_read_header中放置了一个printf,并重新构建它,以查看openCV是否使用freeimage libjpeg定义。它没有打印出来,所以我必须假设没有。
所以我的问题是:
1)为什么连接静态libjpeg和共享的libjpeg不会生成由于重复符号而导致的链接错误?
2)有人知道为什么这两个东西会相互冲突吗?
编辑:以调试模式编译openCV,然后再次以常规模式编译似乎已经解决了问题,不知道发生了什么事。