동적 링크 라이브러리의 rpath가 있습니까?

동적 링크 라이브러리의 rpath가 있습니까?

따라서 제가 작업 중인 프로젝트에서는 시스템 디렉터리가 아닌 디렉터리를 사용하여 코드에서 사용되는 일부 DLL을 보관합니다. 시스템 디렉터리에 넣고 싶지 않으므로 실행 파일은 DLL을 찾기 위해 rpath를 설정합니다. 그러나 점점 더 많은 라이브러리가 추가됨에 따라 이제 해당 디렉터리의 다른 DLL에 의존하는 DLL이 있습니다.

이러한 라이브러리는 링커가 찾는 디렉터리(예: 시스템 디렉터리)에 없기 때문에 자신이 의존하는 DLL을 찾을 수 없습니다.

DLL이 이 특정 비시스템 디렉터리를 검색하도록 하는 방법이 있습니까? rpath와 같은가요? 도서관에서는 이를 어떻게 수행하나요? 이 프로젝트에서 사용되는 빌드 시스템은 CMake입니다(답변에 도움이 되는 경우).

라이브러리에 rPath 태그가 없기 때문에 이 답변은 작동하지 않습니다.https://unix.stackexchange.com/a/272286/4193

를 써볼까 했는데 LD_LIBRARY_PATH잘 되긴 하는데 입력하기 귀찮고 다른 사람이 사용하게 하는 것도 별로 좋지 않습니다. rPath라이브러리에 태그를 추가하는 방법이 있다면 그것이 최선의 선택이 될 것입니다.

이전 관련 질문과 답변을 지적해 주셔서 감사합니다.

답변1

동적 링크 라이브러리의 rpath가 있습니까?

바로 여기에. -Wl,-rpathELF 실행 파일을 사용하는 것처럼 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 구조를 만드십시오 .쓰레기통,,도서관그리고공유하다. 이렇게 하면 프로그램을 호출하기 위해 이전 환경 변수를 사용할 필요가 없습니다. 다른 모든 시스템에서는 이 디렉터리를 라이브러리 경로 환경 변수에 추가하기만 하면 됩니다. 매우 깔끔하고 유니크합니다.

이 해결책도 거부한다면 가능성은 단 하나뿐입니다. 모든 시스템에서 예상되는 고정 경로를 사용할 수도 있고, 경로를 포함하고 역시 예상되는 환경 변수를 사용할 수도 있습니다.

관련 정보