2017-01-03 3 views
0

내 대학 클러스터에 서로 다른 버전의 서로 다른 소프트웨어 버전이있는 caffe (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 
,691,363을 (210)

그것은 오류 :

/software/software/libpng/1.6.23-foss-2016a/lib/libpng16.so.16: undefined reference to `inflateRese[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를 인쇄합니다.,

  • 앞에 추가는 LD_LIBARY_PATH이 경로,
  • -rpath 옵션을 추가하거나
  • -L 옵션을 사용하여 추가 :

    나는 /software/software/zlib/1.2.8-foss-2016a/lib/에서 최신 버전을 가지고 있지만 때

g++은를 사용하여 계속해서보고합니다.

작동하는 것은 -lz 옵션을 제거하고 /software/software/zlib/1.2.8-foss-2016a/lib/libz.so.1을 컴파일/링크 중에 포함 할 파일로 명시 적으로 추가하는 것입니다. 그러나 그것은 마치 해킹처럼 보인다.

-lz 옵션을 수행 할 때 대신 g++/software/software/zlib/1.2.8-foss-2016a/lib/libz.so.1을 사용하려면 어떻게해야합니까? 가급적 간접적으로 cmake (caffe를 만들 때)를 통해 간접적으로.

미리 감사드립니다.

편집

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에가 있어야한다 예 : @ -notation in undefined symbol - 어떻게 든 A 형 기호가 필요합니다. 버전 확인으로가 (하지만 난 ld.so 사람이 페이지에 여기에 대한 문서를 찾을 수 없습니다)

+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

흠,'-L'을 추가하면 트릭을해야합니다. '-lz' 전에 삽입 하시겠습니까? – yugr

답변

0

내 생각 엔 당신이 -L은 그것을 따라 -l에 영향을 미치는대로 작동하지 것이다-lz-L을 추가 할 것입니다. 또한 -rpathLD_LIBRARY_PATH은 런타임 라이브러리 검색 (및 ldd 출력)에 영향을 미치므로 컴파일에 많은 영향을 미치지 않습니다.

+0

아, 고맙습니다! 의미가 있습니다. 오랜 시간 동안 물건을 만들지 않았 음을 보여줍니다. :) – Herbert

관련 문제