libopencv_imgcodecs.so:对‘inflateValidate@ZLIB_1.2.9‘未定义的引用

前几天,移植一个Qt项目到银河麒麟系统上,项目中包含了opencv,因此安装编译了相同版本的opencv和zlib,但是结果在qtcreator上编译都没过去,报错 collect2:error:ld return 1 exit status,因为之前遇到多这个,一般是include和lib不全的问题(本质上是.h头文件中定义了某个函数声明,但是对应的cpp中没有实现),网上搜这个问题,也大多说的是这个问题。

但是找了好久,并且在原系统没有这个问题,于是排除了这个原因。

然后又查看了两个系统上编译环境的配置,发现也是一样的,用的都是系统自带的g++编译器,版本也一致,这就让人想不通了,究竟是哪里错了呢。

然后我就想从qtcreator中找报错信息,不至于除了collect2:error:ld return 1 exit status,什么也没有了吧,于是,我发现了,就在底部应用程序输出旁边,有编译输出:libopencv_imgcodecs.so:对’inflateValidate@ZLIB_1.2.9’未定义的引用,哎,是自己对编译器不熟悉,原来是有报错信息的。

于是开始百度这个错误,发现大多是说zlib库的版本问题,但是我已经下载了这个库啊,并且我在项目的pro配置文件中,引入了编译安装后的libz.so文件(默认安装路径)。

LIBS+=/usr/local/lib/libz.so

又然后,我尝试把这个库的引入去掉,发现还是这个报错,我感觉发现了问题所在,于是我看到了在LIBS的最后,我加了一个

LIBS+=-lz

这是当时为了解决ffmpeg的库添加的一个库,当时没理解,原来这就是zlib库,也就是报错中的ZLIB,于是我就想找到系统这个-lz究竟引用的是哪里的库,百度无果,用whereis也没有找到,我就直接在整个电脑上搜索,果然,被我找到了。在 /lib/aarch64-linux-gnu/ 下,我看到了libz.so.1和libz.so.1.2.8,libz.so.1是指向libz.so.1.2.8的软链接,实质上就是libz.so.1.2.8,从名字上看已经发现了报错的原因:libz的版本不对

于是我抱着尝试的心态,用自己编译后的libz.so.1.2.9,替换了/lib/aarch64-linux-gnu/libz.so.1.2.8,并且把libz.so.1指向了libz.so.1.2.9,然后再进行编译,编译通过了!

虽然解决了问题,但是我没明白为什么在之前的系统上没有问题,因为之前的系统也是银河麒麟,并且我同样找到了/lib/aarch64-linux-gnu/下,zlib版本也是1.2.8,但是就没有这个报错,同样的代码,同样的环境,但是编译结果都不同。

解决这个问题花了整整1天,本来都打算放弃了,但是多亏了发现编译输出以及后边系统libz版本的问题,这次的debug也算是给以后一个解决问题的思路,相信报错信息,因为错了就是错了,操作系统不同这种玄学问题,也不是我们能解释的。

记录一下,今年遇到的第一个头疼的bug。

你可能感兴趣的:(研究生,opencv,qt,银河麒麟,zlib)