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/lib
xxx.out이 호출 될 때 검색되지 않았다는 것입니다. 하지만 xxx.out이 .so 파일을 찾을 수 있도록 .so 경로를 지정하려면 어떻게해야합니까?
추가 -static
로 gcc에 피드 하면 다음과 같은 또 다른 오류가 발생합니다.
undefined reference to `function_proviced_by_the_very_librar'
보인다 .so
하더라도 문제가되지 않습니다 -L
및 -l
GCC로 제공됩니다. 해당 라이브러리로 사용 가능한 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
'IT Share you' 카테고리의 다른 글
현재 프로세스가 GDB에서 실행 중인지 감지하는 방법은 무엇입니까? (0) | 2021.01.07 |
---|---|
다른 모든 함수 호출에 대해 PHP에서 함수를 자동 호출하는 방법 (0) | 2021.01.07 |
타사 디 컴파일 된 dll을 디버깅하는 Resharper (0) | 2021.01.07 |
angular.element에서 원시 DOM 요소를 얻는 방법이 있습니까? (0) | 2021.01.07 |
Android Studio에서 Facebook 라이브러리 가져 오기 : 'ANDROID_BUILD_SDK_VERSION'속성을 찾을 수 없습니다. (0) | 2021.01.07 |