libpng16.so.16:未定义对“inflateReset2@ZLIB_1.2.3.4”的引用

Posted

技术标签:

【中文标题】libpng16.so.16:未定义对“inflateReset2@ZLIB_1.2.3.4”的引用【英文标题】:libpng16.so.16: undefined reference to `inflateReset2@ZLIB_1.2.3.4' 【发布时间】:2017-01-03 09:46:17 【问题描述】:

我正在我的大学集群上构建一个 caffe (3D-caffe) 分支,该集群在 /software/software/<package>/<version-compiler>/ 中具有不同版本的不同软件的不同构建

当cmake执行这个编译步骤时:

g++ -fPIC -Wall -Wno-sign-compare -Wno-uninitialized -O3 -DNDEBUG \
CMakeFiles/caffe.bin.dir/caffe.cpp.o  -o caffe -rdynamic ../lib/libcaffe.so \
../lib/libproto.a /software/software/Boost/1.61.0-foss-2016a/lib/libboost_system.so \
/software/software/Boost/1.61.0-foss-2016a/lib/libboost_thread.so \
-lpthread -lglog /software/software/gflags/2.1.2-foss-2016a/lib/libgflags.so \
-lprotobuf -lpthread -lglog \
/software/software/gflags/2.1.2-foss-2016a/lib/libgflags.so \
-lprotobuf -lhdf5_hl -lhdf5 -lrt -lsz -lz -ldl -lm -lpthread -llmdb -lleveldb -lsnappy \
-lcudart -lcurand -lcublas -lcudnn \
/software/software/OpenCV/3.1.0-foss-2016a/lib/libopencv_highgui.so.3.1.0 \
/software/software/OpenCV/3.1.0-foss-2016a/lib/libopencv_imgcodecs.so.3.1.0 \
/software/software/OpenCV/3.1.0-foss-2016a/lib/libopencv_imgproc.so.3.1.0 \
/software/software/OpenCV/3.1.0-foss-2016a/lib/libopencv_core.so.3.1.0 \
-lopenblas -Wl,-rpath,/home/p253591/3D-Caffe/build/lib:/software/software/Boost/1.61.0-foss-2016a/lib:/software/software/gflags/2.1.2-foss-2016a/lib

TL;DR:基本形式是(注意-lz 用于链接到libz):

g++ ... .../caffe.cpp.o  -o caffe .../libcaffe.so .../libproto.a .../libboost_system.so ...more .so's and -lxyz's... -lz

错误:

/software/software/libpng/1.6.23-foss-2016a/lib/libpng16.so.16: undefined reference to `inflateReset2@ZLIB_1.2.3.4'
collect2: error: ld returned 1 exit status

这似乎是正确的,因为当我将-print-file-name=libz.so.1 选项指定为g++ 时,它会打印/lib/../lib64/libz.so.1,这对于版本来说有点太旧了。

我在/software/software/zlib/1.2.8-foss-2016a/lib/ 有一个更新的版本,但是当我:

将此路径添加到LD_LIBARY_PATH, 将其附加到-rpath 选项,或 使用-L 选项添加它,

g++ 继续使用/lib/../lib64/libz.so.1,因为它报告使用-print-file-name

有效的是删除-lz 选项并显式添加/software/software/zlib/1.2.8-foss-2016a/lib/libz.so.1 作为要在编译/链接期间包含的文件。但这似乎是一种 hack。

当实现-lz 选项时,如何告诉g++ 使用/software/software/zlib/1.2.8-foss-2016a/lib/libz.so.1 而不是/lib/../lib64/libz.so.1?最好通过 cmake 间接(在构建 caffe 时)。

提前谢谢你!

编辑

ldd 声明使用了正确的.so

# ldd /software/software/libpng/1.6.23-foss-2016a/lib/libpng16.so.16
        linux-vdso.so.1 =>  (0x00007fff55599000)
        libz.so.1 => /software/software/zlib/1.2.8/lib/libz.so.1 (0x00007f7875b29000)
        libm.so.6 => /lib64/libm.so.6 (0x00007f7875888000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f787566b000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f78752d7000)
        /lib64/ld-linux-x86-64.so.2 (0x0000003328800000)

此外,这个 libz.so.1 中应该有这个符号:

# nm /software/software/zlib/1.2.8/lib/libz.so.1
...
0000000000008270 T inflateReset2
...
0000000000000000 A ZLIB_1.2.3.4
....
#

我假设 de undefined symbol-error 中的 @-notation 不知何故需要 A 型符号作为版本检查(但我在 ld.so 手册页中找不到任何文档)

【问题讨论】:

readlink -f /software/software/zlib/1.2.8-foss-2016a/lib/libz.so 打印什么? /software/software/zlib/1.2.8-foss-2016a/lib/libz.so.1.2.8 嗯,添加-L 应该可以解决问题。你确定在-lz之前插入吗? 不,我在-lz之后添加了它。我还是有点困惑,因为LD_LIBRARY_PATH 也包含路径优先。 这看起来很神奇,但是我清理了我的构建脚本,删除了所有内容,并且构建通过了 :) (我这样做了好几次,但是构建脚本现在必须正确进行一些编辑我已经完成了) 【参考方案1】:

我的猜测是你添加 -L after -lz 这不起作用,因为 -L 只会影响它后面的 -l。另请注意,-rpathLD_LIBRARY_PATH 正在影响运行时库搜索(以及 ldd 输出),因此它们不会对编译产生太大影响。

【讨论】:

啊,谢谢!有道理,这表明我很久没有做东西了:)

以上是关于libpng16.so.16:未定义对“inflateReset2@ZLIB_1.2.3.4”的引用的主要内容,如果未能解决你的问题,请参考以下文章

未找到 libpng“png_set_longjmp_fn”

未找到 libpng14-14.dll

未找到 libpng.14.so.14 但已安装在 SUSE 上

libpng 中未解析的外部 png_set_longjmp_fn

libpng 错误:CgBI:未处理的关键块 xcode 7.3

在Ubuntu 16.10安装mysql workbench报未安装软件包 libpng12-0错误