홈 디렉토리에 로컬로 라이브러리를 설치했지만 프로그램이 이를 인식하지 못합니다.

홈 디렉토리에 로컬로 라이브러리를 설치했지만 프로그램이 이를 인식하지 못합니다.

루트가 아닌 사용자로 서버에 프로그램을 설치하고 있습니다. 특히 tmux 1.5이지만 내 생각에는 로컬에 설치된 모든 프로그램에 광범위하게 적용되어야 합니다(이 문제가 내 오류가 아닌 경우를 대비해 프로그램 이름을 언급합니다).

이 프로그램을 사용하려면 일부 종속 라이브러리(예: libevent 및 ncurses)를 설치해야 합니다. 그래서 루트 액세스 권한이 없기 때문에 둘 다 로컬로 설치했습니다.

cd $HOME/library/installation/folder
DIR=$HOME/local
./configure --prefix=$DIR 
#... make ... make install 

이제 프로그램을 설치하려면 라이브러리 패키지도 포함해야 했습니다.

cd $HOME/program/installation/folder
./configure --prefix=$DIR CFLAGS="-I$DIR/include" LDFLAGS="-L$DIR/lib"
#... make ... make install 

좋아, 그러면 $HOME/local/bin에 문제 없이 프로그램이 설치되지만 $HOME/local/bin/tmux 실행 파일을 실행하면 다음 오류가 발생합니다.

tmux: 공유 라이브러리를 로드하는 중 오류가 발생했습니다. libevent-2.0.so.5: 공유 개체 파일을 열 수 없습니다. 해당 파일이나 디렉터리가 없습니다.

프로그램이 원하는 라이브러리를 찾을 수 없는 것처럼 보이지만 libevent-2.0.so.5 파일은 실제로 구성 옵션에 지정된 대로 $HOME/local/lib에 존재합니다. 프로그램을 실행하기 위해 설치된 라이브러리를 인식하도록 하려면 어떻게 해야 하는지 궁금합니다. $HOME/lib, $HOME/bin 및 $HOME/local/bin에 기호 링크를 넣으려고 시도했지만 이들 중 아무 것도 작동하지 않았습니다. 어떤 아이디어나 제안이라도 대단히 감사하겠습니다.

답변1

다음을 사용하여 libevent를 다시 빌드해 보십시오.

./configure --disable-shared

바이너리를 빌드할 때 라이브러리가 연결되고 런타임에 검색할 필요가 없기 때문에 이것이 문제를 해결할 것이라고 생각합니다.

또는 동적으로 연결된 libevent가 필요한 경우 libevent-2.0.so.5의 포함 디렉터리를 LD_LIBRARY_PATH 환경 변수에 추가할 수 있습니다.

export LD_LIBRARY_PATH=${HOME}/local/lib/:${LD_LIBRARY_PATH}

답변2

RPATH를 설정할 수도 있습니다.바이너리 자체에 라이브러리 검색 패치를 인코딩합니다..

-R $DIR/lib에 추가하면 됩니다 CFLAGS.

답변3

나는 물어 보았다비슷한 질문, 흥미롭게도 모든 것을 구축하는 것에 대해서도 마찬가지입니다 . 비록 이것이 GNU 와 가 함께 사용되는 tmux어떤 상황에도 관련되어서는 안 된다고 여전히 확신합니다 .configuremake

저는 바이너리에 포함된 라이브러리 검색 경로인 "rpath"를 활용하는 것이 더 깔끔한 접근 방식이라고 생각합니다. -rpath최소한 GNU 링커를 전환하면 " ldrpath"를 지정할 수 있습니다.

그러면 빌드 명령줄은 다음과 같습니다.

PKG_CONFIG_PATH=/path/to/libevent/lib/pkg-config LDFLAGS=-Wl,-rpath,/path/to/libevent/lib ./configure ...

여기서는 실제로 가장 중요한 것은 아니지만 위의 내용은 사람들이 수동으로 스크립트 로 PKG_CONFIG_PATH보내는 작업을 수행하는 데 권장되는 방법입니다 . 을 빌드하면 에서 사용되는 자체 구성 파일이 설치됩니다 . 당신은 그것을 사용해야합니다. 왜냐하면-L/path/to/libevent/lib -I/path/to/libevent/include./configurelibeventpkg-config./configurelibevent 분명히이에 맞서 구축할 때 어떤 스위치를 사용해야 하는지 알고 있습니다.

어쨌든 어떤 상황에서는 -rpath문제를 해결하는 더 깔끔한 접근 방식입니다.

LD_LIBRARY_PATH그러나 기반 솔루션을 사용하면 런타임에 빌드된 바이너리에서 사용되는 라이브러리를 저글링할 수 있으며 이는 때때로 바람직합니다. 그러나 홈 폴더의 전용 위치에 있는 특정 라이브러리에 대해 빌드하려는 경우에는 -rpath기반 솔루션이 정식 답변으로 간주되어야 한다고 생각합니다.

이상한 점은 tmux' 자체 빌드 스크립트가 빌드 중에 라이브러리 검색 경로에서 이 경로를 추론하지 않는 이유입니다. 어쩌면 그럴 필요도 없고, 그래서는 안 되는지도 모르겠습니다. 짓는 우리에게 이런 일이 일어난 것이 우연일까요 tmux?

답변4

다른 사람들에게는 행운이 없었지만 이것은 나에게 효과적이었습니다.여기:

sudo ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5

관련 정보