libpng16.so.16:对“inflateReset2@ZLIB_1.2.3.4”的未定义引用
libpng16.so.16: undefined reference to `inflateReset2@ZLIB_1.2.3.4'
我正在我的大学集群上构建一个 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
作为要在 compilation/linking 期间包含的文件。但这似乎是一个黑客。
如何让 g++
在满足 -lz
选项时使用 /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
....
#
我假设 @
-notation in de undefined symbol
-error 不知何故需要 A 型符号作为版本检查(但我找不到任何关于此的文档在 ld.so
手册页中)
我的猜测是您在 -lz
之后添加 -L
这不会起作用,因为 -L
只会影响 -l
跟随它。另请注意,-rpath
和 LD_LIBRARY_PATH
会影响运行时库搜索(以及 ldd 输出),因此它们不会对编译产生太大影响。
我正在我的大学集群上构建一个 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
作为要在 compilation/linking 期间包含的文件。但这似乎是一个黑客。
如何让 g++
在满足 -lz
选项时使用 /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
....
#
我假设 @
-notation in de undefined symbol
-error 不知何故需要 A 型符号作为版本检查(但我找不到任何关于此的文档在 ld.so
手册页中)
我的猜测是您在 -lz
之后添加 -L
这不会起作用,因为 -L
只会影响 -l
跟随它。另请注意,-rpath
和 LD_LIBRARY_PATH
会影响运行时库搜索(以及 ldd 输出),因此它们不会对编译产生太大影响。