LD_LIBRARY_PATH 및 LIBRARY_PATH


159

간단한 C ++ 프로그램을 작성 중이며 개발 및 테스트를 위해 시스템 제공 공유 라이브러리를 최신 버전으로 일시적으로 대체하고 싶습니다.

LD_LIBRARY_PATH 변수 설정을 시도했지만 링커 (ld)가 실패했습니다.

/ usr / bin / ld : -lyaml-cpp를 찾을 수 없습니다

ld man 페이지에 따르면 작동 할 것으로 예상했습니다.

링커는 다음 검색 경로를 사용하여 필요한 공유 라이브러리를 찾습니다. ... 기본 링커의 경우 환경 변수 "LD_LIBRARY_PATH"의 내용 ...

그런 다음 LIBRARY_PATH 설정을 시도했지만 작동했습니다.

GCC 매뉴얼에 따르면 :

LIBRARY_PATH의 값은 PATH와 같이 콜론으로 구분 된 디렉토리 목록입니다. 네이티브 컴파일러로 구성 될 때 GCC는 GCC_EXEC_PREFIX를 사용하여 찾을 수없는 경우 특수 링커 파일을 검색 할 때 지정된 디렉토리를 시도합니다. GCC를 사용한 링크는 또한 -l 옵션에 대한 일반 라이브러리를 검색 할 때 이러한 디렉토리를 사용합니다 (그러나 -L로 지정된 디렉토리가 우선 함).

(GCC) 매뉴얼에서 알 수 있듯이 GCC와 연결되므로 LIBRARY_PATH가 작동합니다.

그러나..

  • 오류 메시지에서 알 수 있듯이 gcc와 ld가 호출되는 이유는 무엇입니까?
  • 동일한 목적을 달성하는 두 변수를 갖는 점은 무엇입니까? 다른 차이점이 있습니까?

답변:


213

LIBRARY_PATH 컴파일하기 전에 gcc가 프로그램에 링크해야하는 정적 라이브러리와 공유 라이브러리를 포함하는 디렉토리를 검색하기 위해 gcc에서 사용합니다.

LD_LIBRARY_PATH프로그램 에서 성공적으로 컴파일 및 링크 된 후 공유 라이브러리를 포함하는 디렉토리를 검색하는 데 사용됩니다 .

편집 : 아래에서 지적했듯이 라이브러리는 정적이거나 공유 될 수 있습니다. 정적 인 경우 코드가 프로그램으로 복사되므로 프로그램을 컴파일하고 링크 한 후 라이브러리를 검색 할 필요가 없습니다. 라이브러리가 공유되면 프로그램에 동적으로 연결되어야하며 그 시점 LD_LIBRARY_PATH이 시작됩니다.


14
물론 LD_LIBRARY_PATH는 동적 라이브러리에서만 의미가 있습니다.
Alex Jasmin

2
내 요점은 ld를 (직접적으로) 연결하기 위해 사용한다면 ld 매뉴얼에 따르면 LD_LIBRARY_PATH는 내 프로그램에 연결 해야하는 라이브러리가 포함 된 디렉토리를 검색하는 데 사용되었을 것입니다. 나는 여기서 뭔가를 놓치고 있어야한다.
Georgios Politis

2
ld를 직접 호출하지 않고 객체 파일을 라이브러리와 결합하지 않으면 gcc가 전달하는 경로를 '상속'합니다. -Xlinker 옵션을 사용하여 표준 gcc를 재정의 할 수 있습니다.
Naveen

5
실제로 정적 라이브러리 대신 LIBRARY_PATH 정적 AND 동적 라이브러리가 포함 된 디렉토리를 검색하는 데 사용됩니다 .
particle128

3
네, 이것은 잘못이다 -의 차이가가이다 LIBRARY_PATH에서 라이브러리 (정적 또는 동적)를 검색합니다 컴파일 타임LD_LIBRARY_PATH런타임에 동적 라이브러리 검색됩니다. 물론 런타임에는 정적 라이브러리를 검색 할 필요가 없습니다.
Timmmm 2019

47

LD_LIBRARY_PATH프로그램이 시작될 때 LIBRARY_PATH검색되고 링크 타임에 검색됩니다.

의견 에서주의 :


38
참고 : 라이브러리를 링크 할 때 ld자체적으로 LIBRARY_PATH또는 에서 라이브러리를 찾지 않습니다 LD_LIBRARY_PATH. 경우에만의 gcc원용이 ldLIBRARY_PATH사용된다. (어려운 방법을 배웠습니다.)
Rufflewind

1
@Rufflewind 흥미롭지 만 참조가 있다면 훨씬 더 많았을 것입니다.
hmijail는 사임 자 애도한다

이보기는 라이브러리를 검색하는 순간 (링크 시간과 런타임)을 구분하는 반면 @Naveen은 검색된 라이브러리 유형을 정적으로 만듭니다 (정적 v 동적). 두보기가 효과적으로 동일하거나 (동적 : 런타임 = 정적 : 링크 시간)이 대응이 유지되지 않는 중요한 상황이 있습니까? 컴파일 타임에도 동적 라이브러리에 대한 지식이 필요하다고 생각합니다.
XavierStuvw

13

오류 메시지에서 알 수 있듯이 gcc와 ld가 호출되는 이유는 무엇입니까?

gcc는 연결 모드에있을 때 내부적으로 ld를 호출합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.