동적 연결 라이브러리에 대한 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. ELF 실행 파일 에 필요한 라이브러리를 확인하십시오 main .

$ 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일부 libtwo.so공유 객체가 필요하며 둘 다 rpath가 설정되어 있습니다. ./main을 실행하기 위해 LD_LIBRARY_PATH를 설정할 필요가 없습니다.

$ ./main
I'm in bar()

main은 항상 현재 디렉터리인 libtwo.so 종속성을 찾고 .libtwo.so는 항상 디렉터리에서 libone.so 종속성을 찾습니다 libs. 누락된 경우 libs./main이 시작되지 않습니다.

$ 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 구조를 만드십시오 .큰 상자,,lib그리고공유하다. 이렇게 하면 이전 환경 변수를 사용하여 프로그램을 호출할 필요가 없습니다. 다른 모든 시스템에서는 이 디렉터리에 라이브러리 경로 환경 변수를 추가하면 됩니다. 매우 깔끔하고 유니크합니다.

이 해결책도 거부한다면 가능성은 하나밖에 남지 않습니다. 모든 시스템에서 예상되는 고정 경로를 사용하거나 경로를 포함하고 역시 예상되는 환경 변수를 사용합니다.

관련 정보