%20%EB%B2%84%EC%A0%84%EC%9D%98%20%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC%EA%B0%80%20%EC%82%AC%EC%9A%A9%EB%90%98%EB%8F%84%EB%A1%9D%20%ED%99%98%EA%B2%BD%EC%9D%84%20%EA%B5%AC%EC%84%B1%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
나는 이 질문이 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
기본적으로 -rpath
for LIBRARY_PATH
에 대해 수행하는 것입니다 (단지 낮은 우선순위를 부여하는 것이 아닙니다).-rpath
-rpath
LIBRARY_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