올바른(시스템 버전과 다름) 라이브러리 버전을 사용하도록 내 환경을 구성하려면 어떻게 해야 합니까?

올바른(시스템 버전과 다름) 라이브러리 버전을 사용하도록 내 환경을 구성하려면 어떻게 해야 합니까?

이 문제는 ServerFault와 StackOverflow 및 이 사이트 간의 경계 문제인 것 같습니다. 하지만 저는 U&L이 가장 관련성이 높다고 생각합니다.

C++version 의 라이브러리에 의존하는 코드가 있고 X시스템에서 버전 Y(X>Y)을 제공합니다. 이 라이브러리를 컴파일하고 생성된 파일을 에 넣었습니다 . 이 /opt/lib_name/X/lib버전은 라이브러리 Y/usr/lib64연결하고 싶습니다 .so

이제 어떤 방식으로든 버전을 활성화하는 스크립트를 만들고 싶습니다 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가 나타나지 않는다는 점에도 유의해야 합니다.

그러나 귀하의 질문에 따르면 위의 내용은 문제가되지 않는 것 같습니다. 그러나 변수 :값에 불필요한 후행이 있어 LIBRARY_PATH작동하지 않는 이유를 설명할 수 있습니다.

또한 SO 질문에 대한 답변에서 지적했듯이 LD_LIBRARY_PATH동적 링커에서 사용되며 다음에서만 관련됩니다.달리다귀하의 지원을 위해. 이 방법은 애플리케이션이 실행 중일 때 동적 라이브러리의 위치를 ​​찾을 수 없는 경우에 사용할 수 있습니다. GNU 링커가 사용하는 것은 LD_RUN_PATH기본적으로 for 가 수행 -rpath하는 작업을 수행한다는 것입니다. 단, 지정된 모든 수단은 무시됩니다(낮은 우선순위를 부여하는 것이 아니라).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

관련 정보