적절한(시스템 버전과 다른) 버전의 라이브러리가 사용되도록 환경을 구성하는 방법

적절한(시스템 버전과 다른) 버전의 라이브러리가 사용되도록 환경을 구성하는 방법

나는 이 질문이 ServerFault와 StackOverflow와 이 사이트 사이의 경계선이라고 생각합니다. 하지만 저는 U&L이 가장 관련성이 높다고 생각합니다.

C++버전의 라이브러리에 의존하는 일부 코드가 있고 X시스템은 버전 Y(X>Y)을 제공합니다. 이 라이브러리를 컴파일하고 결과 파일을 에 배치했으며 /opt/lib_name/X/lib버전은 Y에 설치되었습니다 /usr/lib64. 도서관 과 연결하고 싶습니다 so.

이제 어떻게든 version 을 활성화하는 스크립트를 만들고 싶습니다 X. 그러면 내가 빌드한 모든 코드가 makefile을 변경하지 않고 gcc버전에 대해 컴파일됩니다 .X

지금은 변수를 설정 LIBRARY_NAME_DIR하고 makefile에 를 추가하기만 하면 -L $LIBRARY_NAME_DIR작동하지만 makefile을 변경해야 합니다.

컴퓨터에 대한 루트 액세스 권한 없이 이런 종류의 작업을 수행할 수 있는 방법이 있습니까?

참고: 이 질문에 대한 답변은 특정 라이브러리나 코드에 의존하지 않는다고 생각하지만 특정 문제에 대한 모든 세부 정보는 다음과 같습니다.https://stackoverflow.com/q/24189130/7918.

내가 시도한 것:

  • 나는 다음을 설정했습니다: LIBRARY_PATH, LD_LIBRARY_PATH, CPLUS_INCLUDE_PATH.

답변1

환경 변수만으로 강력하게 이를 수행할 수 있는 방법은 없다고 생각합니다. 사용 시의 문제점은 LIBRARY_PATH주어진 옵션이 우선순위를 갖는다는 것입니다 -L. 어떤 이유로 gcc든 명령에 이 있으면 -L/usr/lib64먼저 검색하여 이전 버전의 라이브러리를 찾습니다. Makefile을 변경하려는 것처럼 보이지만 -L/usr/lib64먼저 a가 나타나지 않도록 주의해야 합니다.

귀하의 SO 질문을 보면 위의 문제가 아닌 것 같습니다. 그러나 :변수 값에 불필요한 후행이 있어 LIBRARY_PATH변수가 작동하지 않은 이유를 설명할 수 있습니다.

또한 SO 질문에 대한 답변에서 언급했듯이 LD_LIBRARY_PATH동적 링커에서 사용되며 다음에서만 관련됩니다.실행 시간귀하의 지원을 위해. 애플리케이션 실행 시 동적 라이브러리의 위치를 ​​찾을 수 없는 경우에 사용할 수 있습니다. GNU 링커에 의해 사용되는 것은 무시될 수단을 지정하는 것을 제외하고는 LD_RUN_PATH기본적으로 -rpathfor LIBRARY_PATH에 대해 수행하는 것입니다 (단지 낮은 우선순위를 부여하는 것이 아닙니다).-rpath-rpathLIBRARY_PATH

그러면 시도해 볼 수 있는 것은 다음과 같습니다.

LIBRARY_PATH=/opt/lib_name/X/lib LD_RUN_PATH=/opt/lib_name/X/lib make

gcc보다 강력할 수 있는 방법은 필요한 옵션을 포함하는 래퍼 스크립트를 만드는 것입니다 . 예:

#!/bin/sh
gcc -L/opt/lib_name/X/lib -Wl,-rpath,/opt/lib_name/X/lib "$@"

파일 이름을 으로 지정 gcc하고 실행 가능하게 만든 다음 단독으로 디렉터리(또는 필수 명령과 이름이 같은 파일이 없는 디렉터리)에 넣습니다. 그러면 다음과 같이 실행할 수 있습니다 make.

PATH=/path/to/script:$PATH make

관련 정보