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
。另请注意,-rpath
和 LD_LIBRARY_PATH
正在影响运行时库搜索(以及 ldd 输出),因此它们不会对编译产生太大影响。
【讨论】:
啊,谢谢!有道理,这表明我很久没有做东西了:)以上是关于libpng16.so.16:未定义对“inflateReset2@ZLIB_1.2.3.4”的引用的主要内容,如果未能解决你的问题,请参考以下文章
未找到 libpng“png_set_longjmp_fn”
未找到 libpng.14.so.14 但已安装在 SUSE 上
libpng 中未解析的外部 png_set_longjmp_fn