IT Share you

GCC Linux에서 기본이 아닌 공유 라이브러리 경로를 지정하는 방법은 무엇입니까?

shareyou 2021. 1. 7. 19:54
반응형

GCC Linux에서 기본이 아닌 공유 라이브러리 경로를 지정하는 방법은 무엇입니까? 실행할 때 "공유 라이브러리를로드하는 동안 오류"발생


루트 권한이없는 노트북이 있습니다.

컴퓨터에 configure --prefix=$HOME/.usr.

그 후 다음 파일을 얻었습니다 ~/.usr/lib.

libXX.so.16.0.0
libXX.so.16
libXX.so
libXX.la
libXX.a

이 명령을 사용하여 라이브러리에서 제공하는 함수 중 하나를 호출하는 프로그램을 컴파일 할 때 : gcc XXX.c -o xxx.out -L$HOME/.usr/lib -lXX

xxx.out이 경고없이 생성되었지만 실행하면 다음과 같은 오류가 발생했습니다.

./xxx.out: error while loading shared libraries: libXX.so.16: cannot open shared object file: No such file or directory,하지만 libXX.so.16거기에 있습니다.

내 단서없는 가정은 ~/.usr/libxxx.out이 호출 될 때 검색되지 않았다는 것입니다. 하지만 xxx.out이 .so 파일을 찾을 수 있도록 .so 경로를 지정하려면 어떻게해야합니까?

추가 -static로 gcc에 피드 하면 다음과 같은 또 다른 오류가 발생합니다.

undefined reference to `function_proviced_by_the_very_librar'

보인다 .so하더라도 문제가되지 않습니다 -L-lGCC로 제공됩니다. 해당 라이브러리로 사용 가능한 exe를 빌드하려면 어떻게해야합니까?


저와 같은 질문이있는 다른 사람들을 위해

tldp에서 이것 에 대한 유용한 기사를 찾았 습니다 .

정적 / 공유 / 동적로드 라이브러리와이를 사용하는 몇 가지 예제 코드를 소개합니다.


이를 달성하는 방법에는 두 가지가 있습니다.

  • -rpath링커 옵션 사용 :

gcc XXX.c -o xxx.out -L$HOME/.usr/lib -lXX -Wl,-rpath=/home/user/.usr/lib

  • LD_LIBRARY_PATH환경 변수 사용 - ~/.bashrc파일에 다음 줄을 넣으십시오 .

    export LD_LIBRARY_PATH=/home/user/.usr/lib

이것은 사전 생성 된 바이너리에서도 작동하므로, 예를 들어 debian.org 에서 일부 패키지를 다운로드 하고 바이너리와 공유 라이브러리를 홈 디렉토리에 풀고 다시 컴파일하지 않고 실행할 수 있습니다.

빠른 테스트를 위해 (적어도 bash에서) 다음을 수행 할 수도 있습니다.

LD_LIBRARY_PATH=/home/user/.usr/lib ./xxx.out

다른 모든 항목에 대해 라이브러리 경로를 변경하지 않는 이점이 있습니다.


그것은이어야한다 LIBRARY_PATH대신 LD_LIBRARY_PATH. 옵션 LIBRARY_PATH으로 볼 수있는 gcc 검사-v

참조 URL : https://stackoverflow.com/questions/8835108/how-to-specify-non-default-shared-library-path-in-gcc-linux-getting-error-whil

반응형