libpng警告:应用程序和库中的libpng版本不兼容

11

我的一个应用程序依赖于大量的库(难道不是吗)。其中大多数库都是通过包管理器安装的。对于那些没有通过包管理器安装的库,我已经重新编译了它们,但我仍然收到相同的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。


2
@Dat Chu - 我也遇到了你的同样问题,既然你发现OpenCV自带了libpng的版本,那我该怎么做才能正确编译我的代码呢?你是按照下面的两个建议中的哪一个来做的呢?感谢你的帮助! - Matteo
4个回答

5
似乎你的应用程序在动态链接一个.so库文件,而该文件安装在除你所使用的头文件之外的其他位置。你可以使用ldd <binary>命令查看二进制文件正在调用哪个.so文件,然后从该目录获取头文件(除非它是系统目录),并将其用于编译时更改你的-I标志。否则,我认为你需要安装libpng-1.4.3,以便你可以根据它的头文件进行编译。

1

马克·B已经解释过了。现在再给马特奥解释一遍。

您的链接器会选择 libpng 的第一个出现位置,这似乎是嵌套在 OpenCV 中的。请查看您的 Makefile,并将本地版本放在包含 OpenCV 的 Includes 之前。在我的情况下:

-I/usr/include/libpng12 -lpng12 [ ... ] -L/usr/local/lib -lopencv_core


0
正如你在问题中指出的,OpenCV实际上确实带有自己的libpng版本,但是你可以选择使用系统安装的libpng版本。只有在从源代码构建OpenCV时才可以这样做:在运行cmake时禁用BUILD_PNG选项。

0

原因: OpenCV/CMakeLists.txt 文件:

OCV_OPTION(BUILD_PNG   "Build libpng from source"   WIN32 OR ANDROID OR APPLE)

enter image description here

方法:重新编译您的OpenCV,并使用此参数:

cmake -D BUILD_PNG=ON (+your other params)
make
sudo make install

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接