2017-01-03 6 views
0

私は大学クラスター上に異なるソフトウェアの異なるバージョンの異なるビルドを持つ、フォークのフォーク(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ページでは、この上の任意のドキュメントを見つけることができませんでした)

+0

「readlink -f/software/software/zlib/1.2.8-foss-2016a/lib/libz.so」とは何ですか? – yugr

+0

'/ソフトウェア/ソフトウェア/ zlib/1.2.8-foss-2016a/lib/libz.so.1.2.8' – Herbert

+0

Hm、' -L'を追加するとそのトリックが行われます。 '-lz'の前に挿入してもよろしいですか? – yugr

答えて

0

私の推測では、あなたが-Lだけそれに従う-lに影響を与える動作しませんどの-lz-Lを追加することです。また、-rpathLD_LIBRARY_PATHは、実行時ライブラリの検索(およびlddの出力)に影響を与え、コンパイルにあまり影響しないことにも注意してください。

+0

ああ、ありがとうございました!意味がある、それは私が長い時間のものを構築していないことを示すようになります:) – Herbert

関連する問題