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


10

루트가 아닌 사용자로 서버에 프로그램을 설치하고 있습니다. 특히 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에 기호 링크를 넣으려고 시도했지만 아무 것도 작동하지 않았습니다. 모든 아이디어와 제안은 크게 감사하겠습니다


나는 가정 -R $DIR/lib에가 CFLAGS구축하는 동안이다 tmux(그리고 libevent). 이것은 나에게 도움이되지 않았다-gcc에서 인식 할 수 없다는 마지막 오류가있었습니다 -R( -R그리고 사이에 공백없이 시도했습니다 $DIR). ./configure --disable-shared이 작업은 업데이트되었습니다 LD_LIBRARY_PATH. libevent위의 --disable-shared옵션으로 다시 만들었습니다 .

답변:


20

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

./configure --disable-shared

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

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

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

와우, 빠른 답변 주셔서 감사합니다. 차후 라이브러리 설치에이 수정 사항을 적용하고 항상 $ HOME / local 디렉토리를 사용할 수 있으므로 LD_LIBRARY_PATH를 사용하여 문제점을 수정했습니다. 도움을 주셔서 감사합니다!
scicalculator


2

다른 사람들과 운이 좋지는 않지만 여기 에서 나를 위해 일했습니다 .

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

2

나는 모든 것을 만드는 것에 대해 흥미롭게도 비슷한 질문을했다 . tmux(여전히 이것이 GNU configuremake함께 사용되는 모든 상황과 관련이 있다고 확신하지만 .

더 깔끔한 접근 방식은 바이너리 경로에 내장 된 라이브러리 검색 경로 인 소위 "rpath"를 이용하는 것입니다. -rpath적어도 GNU 링커 의 스위치 ld는 경로를 지정합니다.

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

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것을 수행하는 권장 방법 ./configure입니다. 빌드 할 때에 사용되는 libevent자체 구성 파일을 설치합니다 . 스위치를 작성할 때 어떤 스위치를 사용해야하는지 확실하게 알고 있기 때문에 사용해야합니다.pkg-config./configurelibevent

어쨌든 어떤 상황에서는 -rpath문제를 해결하기위한보다 확실한 접근 방법이 있습니다.

LD_LIBRARY_PATH그러나 기반 솔루션을 사용하면 런타임에 빌드 된 바이너리가 사용하는 라이브러리를 저글링 할 수 있습니다. 그러나 특정 라이브러리에 대해 빌드하려는 경우 홈 폴더의 전용 위치에 배치 한 경우 -rpath기반 솔루션은 정식 답변으로 간주됩니다.

이상한 점은 tmux'빌드 스크립트가 빌드 중에 라이브러리 검색 경로 에서이 경로를 유추하지 않는 이유 입니다. 어쩌면 그들은 필요하지 않을 수도 있습니다. 이것이 우리를 만든 사람에게 일어난 우연의 일치 tmux입니까?

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.