我有一个应用程序,它依赖于过多的库(不是我们所有的)。大多数这些库都是通过包管理器安装的。对于那些没有的,我已经重新编译它们但我仍然得到相同的libpng不兼容错误。
libpng warning: Application was compiled with png.h from libpng-1.2.44
libpng warning: Application is running with png.c from libpng-1.4.3
这是一个错误,因为生成的缓冲区为空。我如何知道哪个库链接到新库以及哪个库链接到旧库?
ldd <executable-name>
...
libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f5a0660f000)
...
运行locate png.h
给了我几个系统级文件
/usr/include/png.h
/usr/include/libpng12/png.h
所有这些都是1.2.44。
我正在运行Ubuntu 11.04 x86-64。
更新:OpenCV附带自己的libpng版本1.4.3
看起来您的应用程序动态链接安装在您正在使用的标头之外的某个地方的.so
库文件。你可以ldd <binary>
找出你的二进制文件正在拾取哪个.so
,然后从该目录中获取头文件(除非它是一个系统目录)而不是你正在使用的那个。你可以通过在编译时更改-I
标志来完成此操作。否则我认为您需要安装libpng-1.4.3
,以便您可以针对其标头进行编译。
马克B已经解释过了。现在为Matteo加盟了
你的链接器选择了libpng的第一个外观。它似乎嵌套在OpenCV中。查看Makefile并在包含OpenCV之前添加本地版本。就我而言:
-I / usr / include / libpng12 -lpng12 [...] -L / usr / local / lib -lopencv_core
正如您的问题所指出的,OpenCV确实附带了自己的libpng版本,但您可以选择使用系统上安装的libpng版本。您只能在从源代码构建OpenCV时执行此操作:在运行cmake时禁用BUILD_PNG。