티스토리 뷰
의 설정이 LD_LIBRARY_PATH
가장 높은 우선 순위를 가지므로이 설정이 설정되면에서 언급 한
디렉터리 LD_LIBRARY_PATH
집합
이 표준 디렉터리 집합보다 먼저 검색 됩니다. 따라서 귀하의 경우 설정은 옵션으로
언급 된 라이브러리 LD_LIBRARY_PATH
조회에 영향을 미칩니다 . 일부 종속성
이 없으면 표준 디렉토리 세트에서 해결되었을 수 있습니다.-l
LD_LIBRARY_PATH
LD_LIBRARY_PATH
디버깅에 대한 도움말을 설정 하고 최신 버전의
라이브러리 를 사용해보기는 하지만 일반 개발 환경 설정 및 배포에서 사용하는 것은 좋지 않은 것으로 간주됩니다.
공유 라이브러리에 대한 자세한 내용은 Linux 문서 의이 HOWTO 를 참조하십시오.
-------------------이 질문에 대한 두 가지 대답이 있습니다. 대답의 일부는 컴파일 타임 링크 (즉 gcc -lfoo -L/usr/lib
...를 호출 함 ld
)와 런타임 링커 조회에 있습니다.
프로그램을 컴파일 할 때 컴파일러는 구문을 확인한 다음 링커는 무엇보다도 실행에 필요한 심볼 (예 : 변수 / 메서드 등)이 있는지 확인합니다. LD_LIBRARY_PATH
앞서 언급했듯이, 검색 경로를 수정하여 런타임 링커가 동작하는 방식뿐만 아니라 방식 gcc
/ ld
동작 을 변경하는 부작용이 있습니다.
프로그램을 실행할 때 런타임 링커는 실제로 공유 라이브러리 (디스크 또는 가능한 경우 메모리에서)를 가져오고 공유 기호 / 코드 등을로드합니다. 다시이 LD_LIBRARY_PATH
검색 경로에 암시 적으로 영향을줍니다 (때로는 좋지 않은 경우도 있음). , 언급했듯이.)
LD_LIBRARY_PATH
대부분의 Linux 시스템에서 사용하지 않고 이에 대한 올바른 수정은 공유 라이브러리가 포함 된 경로를에 추가하고 /etc/ld.so.conf
(또는 일부 배포에서는 /etc/ld.so.conf.d/
경로가 있는 파일을 생성 ) 실행 ldconfig
( /sbin/ldconfig
루트로)하여 런타임 링커 바인딩을 업데이트하는 것입니다. 은닉처.
Debian의 예 :
jewart@dorfl:~$ cat /etc/ld.so.conf.d/usrlocal.conf
/usr/local/lib
그런 다음 프로그램이 실행되면 런타임 링커는 해당 디렉토리에서 바이너리가 링크 된 라이브러리를 찾습니다.
런타임 링커가 알고있는 라이브러리를 알고 싶다면 다음을 사용할 수 있습니다.
jewart@dorfl:~$ ldconfig -v
/usr/lib:
libbfd-2.18.0.20080103.so -> libbfd-2.18.0.20080103.so
libkdb5.so.4 -> libkdb5.so.4.0
libXext.so.6 -> libXext.so.6.4.0
그리고 바이너리가 연결된 라이브러리를 알고 싶다면 다음 ldd
과 같이 사용할 수 있습니다. 이렇게하면 런타임 링커가 선택할 라이브러리를 알 수 있습니다.
jewart@dorfl:~$ ldd /bin/ls
linux-vdso.so.1 => (0x00007fffda1ff000)
librt.so.1 => /lib/librt.so.1 (0x00007f5d2149b000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00007f5d2127f000)
libacl.so.1 => /lib/libacl.so.1 (0x00007f5d21077000)
libc.so.6 => /lib/libc.so.6 (0x00007f5d20d23000)
-------------------LD_LIBRARY_PATH
응용 프로그램을 실행할 때 공유 라이브러리를 찾기위한 것입니다. 링크에 영향을 미치는 부작용이며 이에 의존해서는 안됩니다.
종종 원치 않는 부작용으로 LD_LIBRARY_PATH는 -L로 지정된 디렉토리 다음에 링크 (ld) 단계에서 검색됩니다 (또한 -L 플래그가 제공되지 않은 경우).
LD_LIBRARY_PATH가 나쁜 이유
-------------------나는 생각했다, 나는 링커가 사용하는 다시 떨어지고 말 것입니다 LD_LIBRARY_PATH
귀하의 직접 링크 (예 : 것을 해결 라이브러리에 libabc.so
, libdef.so
및 libghi.so
) 동적에 연결되어 있습니다. 의 매뉴얼 페이지를 보면을 사용하여 빌드 된 ld
에 대한 링크 가 동적으로 바인딩 된 기호의 조회 작동 방식에 영향을 미치는 것처럼 보입니다 ..so
-rpath
g ++에 대한 남자를 확인한 결과 제공된 경로에서 -lxxxxx
옵션이 찾고 있다는 것을 알았습니다. 따라서 링크 할 때 파일 만 로드됩니다. 런타임에 라이브러리가 누락 된 경우 공유 객체로서의 라이브러리 만 있으므로 .so가로드 된 다음 . 내가 일하고 실행, 나는 몇 가지 라이브러리 디렉토리에 버전이 있음을보고 하고 나는 그것이 라이브러리가 연결시에 연결 또는 공유 개체로 런타임에 링크 될 수 있음을 의미한다고 생각하므로.libxxxxx.a
-L
.a
LD_LIBRARY_PATH
libxxxx.a
libxxxx.so
라이브러리가 공유 객체로만 존재하는 경우 LD_LIBRARY_PATH
런타임에 라이브러리 디렉토리 경로 를 찾아야 함을 의미합니다. 라이브러리가 아카이브 된 .a로만 존재하는 경우 실행 파일의 빌드와 -L 디렉토리 경로에서 링크 -lxxxxx
되어야하며 컴파일시 g ++에서 제공되어야 함을 의미합니다.
이것은 내 이해입니다 .... 그리고 적어도 그것은 당신의 관찰과 일치합니다
출처
https://stackoverflow.com/questions/1904990