私は大学クラスター上に異なるソフトウェアの異なるバージョンの異なるビルドを持つ、フォークのフォーク(3D-caffe)をビルドしています/software/software/<package>/<version-compiler>/
libpng16.so.16: `[email protected]_1.2.3.4 'への未定義の参照
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:必需品の形態である(libz
にリンクするため-lz
に注意):
g++ ... .../caffe.cpp.o -o caffe .../libcaffe.so .../libproto.a .../libboost_system.so ...more .so's and -lxyz's... -lz
を210の
このエラー:
/software/software/libpng/1.6.23-foss-2016a/lib/libpng16.so.16: undefined reference to `[email protected]_1.2.3.4'
collect2: error: ld returned 1 exit status
そして、私はg++
に-print-file-name=libz.so.1
オプションを指定すると、それがバージョンについて少し古すぎている、/lib/../lib64/libz.so.1
を出力するので、これは、正しいと思われます。
私は/software/software/zlib/1.2.8-foss-2016a/lib/
で新しいバージョンを持っていますが、I:
- 先頭に追加
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
を明示的にファイルとして追加してコンパイル/リンク時に含めることです。しかし、それはハックのように思えます。
-lz
オプションを実行する場合、ではなく/software/software/zlib/1.2.8-foss-2016a/lib/libz.so.1
の代わりにg++
を使用するように指定できますか?好ましくは間接的にcmakeを介して(caffeを構築する場合)。
ありがとうございます!
EDIT
ldd
状態右.so
が使用される:私は「
# nm /software/software/zlib/1.2.8/lib/libz.so.1
...
0000000000008270 T inflateReset2
...
0000000000000000 A ZLIB_1.2.3.4
....
#
:
# 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であるはずmは@
と表示されています - undefined symbol
の中に-errorが何らかの形でAタイプのシンボルを必要としていますバージョンチェックなどがある(しかし、私はld.so
manページでは、この上の任意のドキュメントを見つけることができませんでした)
「readlink -f/software/software/zlib/1.2.8-foss-2016a/lib/libz.so」とは何ですか? – yugr
'/ソフトウェア/ソフトウェア/ zlib/1.2.8-foss-2016a/lib/libz.so.1.2.8' – Herbert
Hm、' -L'を追加するとそのトリックが行われます。 '-lz'の前に挿入してもよろしいですか? – yugr