따라서 제가 작업 중인 프로젝트에서는 시스템 디렉터리가 아닌 디렉터리를 사용하여 코드에서 사용되는 일부 DLL을 보관합니다. 시스템 디렉터리에 넣고 싶지 않으므로 실행 파일은 DLL을 찾기 위해 rpath를 설정합니다. 그러나 점점 더 많은 라이브러리가 추가됨에 따라 이제 해당 디렉터리의 다른 DLL에 의존하는 DLL이 있습니다.
이러한 라이브러리는 링커가 찾는 디렉터리(예: 시스템 디렉터리)에 없기 때문에 자신이 의존하는 DLL을 찾을 수 없습니다.
DLL이 이 특정 비시스템 디렉터리를 검색하도록 하는 방법이 있습니까? rpath와 같은가요? 도서관에서는 이를 어떻게 수행하나요? 이 프로젝트에서 사용되는 빌드 시스템은 CMake입니다(답변에 도움이 되는 경우).
라이브러리에 rPath 태그가 없기 때문에 이 답변은 작동하지 않습니다.https://unix.stackexchange.com/a/272286/4193
를 써볼까 했는데 LD_LIBRARY_PATH
잘 되긴 하는데 입력하기 귀찮고 다른 사람이 사용하게 하는 것도 별로 좋지 않습니다. rPath
라이브러리에 태그를 추가하는 방법이 있다면 그것이 최선의 선택이 될 것입니다.
이전 관련 질문과 답변을 지적해 주셔서 감사합니다.
답변1
동적 링크 라이브러리의 rpath가 있습니까?
바로 여기에. -Wl,-rpath
ELF 실행 파일을 사용하는 것처럼 ELF 공유 객체를 사용할 수 있습니다 . 내가 생각해낸 작은 예를 복제하세요.
여기:
git clone https://gist.github.com/ardrabczyk/6aeb8545c9b754d6b15be390af4bdff0
make
컴파일을 실행합니다 . main
ELF 실행 파일에 필요한 라이브러리를 확인하십시오 .
$ readelf -d ./main
Dynamic section at offset 0xe30 contains 22 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libtwo.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000f (RPATH) Library rpath: [.]
(...)
어떤 라이브러리가 필요한지 확인하십시오 libtwo.so
.
$ readelf -d ./libtwo.so
Dynamic section at offset 0xe38 contains 22 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [libone.so]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
0x000000000000000f (RPATH) Library rpath: [libs]
(...)
보시다시피 둘 다 일부 공유 개체가 main
필요 하고 둘 다 rpath가 설정되어 있습니다. libtwo.so
./main을 실행하기 위해 LD_LIBRARY_PATH를 설정할 필요는 없습니다.
$ ./main
I'm in bar()
.
main은 항상 현재 디렉터리에서 libtwo.so 종속성을 찾고, libtwo.so는 항상 libs
디렉터리에서 libone.so 종속성을 찾습니다. ./main이 없으면 libs
시작되지 않습니다.
$ mv libs libs.bak
$ ./main
./main: error while loading shared libraries: libone.so: cannot open shared object file: No such file or directory
복원하려면:
$ mv libs.bak libs
$ ./main
I'm in bar()
답변2
시스템의 일부로 간주하고 싶지 않으므로 사용자 애플리케이션으로 사용하십시오.
~/.local/lib/
에 추가하면 LD_LIBRARY_PATH
거기에 모든 것을 넣을 수 있습니다. ~/.local/
다음과 같은 부분적인 FHS 구조를 만드십시오 .쓰레기통,등,도서관그리고공유하다. 이렇게 하면 프로그램을 호출하기 위해 이전 환경 변수를 사용할 필요가 없습니다. 다른 모든 시스템에서는 이 디렉터리를 라이브러리 경로 환경 변수에 추가하기만 하면 됩니다. 매우 깔끔하고 유니크합니다.
이 해결책도 거부한다면 가능성은 단 하나뿐입니다. 모든 시스템에서 예상되는 고정 경로를 사용할 수도 있고, 경로를 포함하고 역시 예상되는 환경 변수를 사용할 수도 있습니다.