[gcc] LD_LIBRARY_PATH 및 LIBRARY_PATH

간단한 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가 호출되는 이유는 무엇입니까?
  • 동일한 목적을 달성하는 두 변수를 갖는 점은 무엇입니까? 다른 차이점이 있습니까?


답변

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

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

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


답변

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

의견 에서주의 :


답변

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

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


답변