/usr/lib/x86_64-linux-gnu/<libname>
우분투에서는 기본적으로 검색되지 않는 에 설치된 라이브러리에 대해 연결 오류가 발생하는 경향이 있습니다 . 최신 예에서는 Python 바인딩을 사용하려고 시도했지만 패키지 가 공유 개체 아래에 설치되어 있고 Python(gcc에 의존하는 것으로 보임)이 패키지를 검색하지 않기 때문에 fswatch
불만이 표시됩니다 .undefined symbol: fsw_init_library
fswatch
/usr/lib/x86_64-linux-gnu/libfswatch
아래와 같이 해당 디렉터리를 검색 경로에 추가하도록 플래그를 하드코딩할 수 있지만 이는 매우 취약하고 이식성이 없으며 완전히 잘못된 것 같습니다.
if sys.platform == 'linux':
os.setenv ('LD_LIBRARY_PATH', '/usr/lib/x86_64-linux-gnu/libfswatch')
다른 목적 으로 사용하거나 LD_LIBRARY_PATH
x86_64가 아닌 플랫폼도 지원하거나 이 문제로 인해 여러 종속성이 있는 등 의 경우 이는 매우 빠르게 매우 복잡해집니다. 게다가 주문은 툴체인에 따라 크게 다릅니다. 위의 코드는 Python에서 작동합니다. Makefile+gcc에는 다른 것이 필요할 수 있습니다.
이 플랫폼, 패키지 및 도구 관련 문제를 방지하는 더 나은 처리 방법이 있습니까? 패키지가 라이브러리 검색 경로에 넣는 것에 관심이 없는 이와 같은 라이브러리를 범위로 가져오는 "올바른"(예상) 방법은 무엇입니까? 환경 변수를 올바른 방식으로 설정하는 마법 스크립트가 있습니까? 그러한 라이브러리를 "활성화"하는 설정이 누락되었습니까? pkg-config와 같은 것으로 충분하지만 fswatch
pkg-config 파일은 제공되지 않습니다 .pc
. 여기서는 fswatch를 예로 사용하고 있지만 이 문제로 인해 짜증이 난 것은 이번이 처음이 아닙니다(비록 과거 사건의 구체적인 내용은 기억나지 않지만).
답변1
여기에는 두 가지 측면이 있습니다.
첫 번째는 런타임 라이브러리 확인입니다. 이것이 LD_LIBRARY_PATH
구성입니다. 이 상황을 처리하는 가장 깔끔한 방법은 /etc/ld.so.conf.d
라이브러리가 포함된 디렉터리를 가리키는 파일을 만드는 것입니다 .
echo /usr/lib/x86_64-linux-gnu/libfswatch | sudo tee /etc/ld.so.conf.d/fswatch-x86_64-linux-gnu.conf
sudo ldconfig
두 번째는 빌드 시간 해결입니다. 이 문제에 대한 단일 "최상의" 솔루션은 없습니다. 하나의 pkg-config
파일이 얻을 수 있는 최고이지만 빌드는 분명히 해당 파일을 참조해야 한다는 것을 알아야 합니다.