我有一个应用程序依赖于过多的库(不是我们所有的)。大多数这些库都是通过包管理器安装的。对于那些没有的,我已重新编译它们但我仍然得到相同的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
答案 0 :(得分:4)
您的应用程序似乎是动态链接安装在您正在使用的标头之外的某个.so
库文件。您可以ldd <binary>
找出您的二进制文件正在拾取的.so
,然后从该目录中获取头文件(除非它是系统目录)而不是您正在使用的那个。您可以通过在编译时更改-I
标志来完成此操作。否则我认为您需要安装libpng-1.4.3
,以便您可以针对其标题进行编译。
答案 1 :(得分:1)
Mark B已经解释过了。 现在加入Matteo
你的链接器会首次出现libpng。这似乎是嵌套的 在OpenCV中。查看您的Makefile并将您的本地版本放在之前 OpenCV包含在包含中。就我而言:
-I / usr / include / libpng12 -lpng12 [...] -L / usr / local / lib -lopencv_core
答案 2 :(得分:0)
正如您的问题所指出的,OpenCV 附带自己的libpng版本,但您可以选择使用系统上安装的libpng版本。您只能在从源代码构建OpenCV时执行此操作:在运行cmake时禁用BUILD_PNG。
答案 3 :(得分:0)