2015-01-22 5 views
4

빌드해야하는 프로그램이 있습니다. 프로그램은 libA에 따라 다르며 libAlibB에 따라 다릅니다. 두 라이브러리 모두 같은 폴더에 있지만 libB.so이 포함되어 있지 않으므로 ldd libA.so에 링크를 추가해야합니다.gcc 빌드 링크가 있지만 공유 라이브러리가 ldd에 표시되지 않습니다

이 내 gcc 명령입니다

gcc -L/path/to/libraries/lib -lA -lB -I/path/to/libraries/include main.cpp

프로그램 빌드 및 링크,하지만이 시작되지 않습니다. ldd

./a.out: symbol lookup error: /path/to/libraries/lib/libA.so: undefined symbol: symbol_used_in_libA_but_defined_in_libB

내가 libB.so 내 바이너리에 포함되지 않은 것을 볼 수 있습니다 :

  • /path/to/libraries 내부 LD_LIBRARY_PATH
  • 이다 : 나는 이러한 조건이

    linux-vdso.so.1 => (0x00007fffaecd9000) 
    libA.so => /path/to/libraries/lib/libA.so (0x00007effc02a4000) 
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007effbfebb000) 
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007effbfca5000) 
    /lib64/ld-linux-x86-64.so.2 (0x00007effc05cb000) 
    

    그것은 나에게 다음과 같은 오류를 제공합니다

  • ldconfig을 실행하면 OK이고입니다.찾아 모두 libA.so
  • GCC 명령에 나는 그것이 나에게 링커 오류를 제공 -lB-lBB로 변경, 그래서 그것을 실행 내부를 연결하지 않는 경우에도 gcc가 제대로 libB.so을 찾을 수 있다고 생각한다면 libB.so.

내가 뭘 잘못하고있어? 실행 파일을 두 라이브러리 모두에 연결하려면 어떻게해야합니까?

답변

6

대부분의 리눅스 배포판 (난 당신이 ldd의 출력을 기반으로 리눅스를 사용한다고 가정) (예를 들어, 데비안 here 참조) 기본적으로 ld--as-needed을 통과으로 gcc을 구성 할 것으로 보인다. 즉, 해당 라이브러리의 일부 심볼이 라이브러리/실행 파일에 실제로 사용되는 경우 마지막 라이브러리/실행 파일은 해당 라이브러리에만 의존합니다 (즉 해당 라이브러리에 DT_NEEDED 태그가 있음).

main.cpplibB의 기능을 사용하지 않으므로 링커는 최종 실행 파일의 종속성으로 libB을 추가하지 않습니다. --no-as-needed 플래그를 링커에 전달하여 문제를 해결할 수 있습니다. 예를 들어,

gcc -Wl,--no-as-needed ...

은 물론, 적절한 수정 libA를 다시 연결하고 종속성으로 libB이 나열되어 있는지 확인하는 것입니다.

+0

이렇게하면 문제가 해결되었습니다. 내 것이 아니기 때문에 도서관을 재건 할 수는 없다. 어쨌든 내 동료 pc에서 같은 라이브러리를 사용하는 동일한 명령이 대신 작동하기 때문에 확인해야합니다. – Jepessen

관련 문제