공유 객체 파일을 수동으로 링크

공유 객체 파일을 수동으로 링크

최근에 대규모 프로젝트를 컴파일하고 설치하려고 하다가 임베디드 Yocto Linux 프로젝트의 종속성 지옥에 갇히게 되었습니다. 종속성을 설치할 때(보통 구성/만들기/만들기 설치 단계에서) 라이브러리를 찾을 수 없음 오류가 자주 발생합니다. /usr/libor를 잠깐 살펴보고 /lib확실히 .so 파일이 거기에 있다는 것을 알 수 있습니다.

예를 들어 찾을 수 없다고 불평하는 경우 다음을 보고 libfoo확인합니다 ./usr/lib

$ ls /usr/lib/libfoo*  
libfoo.so.3    libfoo.so.3.5.2

링커가 엄격하게 찾고 있다는 것을 알았 libfoo.so으므로 소프트 링크를 만들었습니다.

$ ln -s /usr/lib/libfoo.so.3.5.2 /usr/lib/libfoo.so

그러면 갑자기 링커가 컴파일 중에 이를 발견하고 기뻐합니다.

가끔은 왜 이 작업을 수행해야 합니까? 소스에서 종속성을 수동으로 설치할 때 이는 정상적인 프로세스로 간주됩니까, 아니면 수행해야 할 일부 단계가 누락되었습니까?

내 결과는 다음과 같습니다 uname(유용한 경우).

$uname -a
Linux ventana 3.14.48-1.0.x-ga+yocto+gd9991ca #1 SMP Wed Apr 18 15:23:20 MST 2018 armv7l GNU/Linux

답변1

일반적으로 말하면, 프로젝트가 여러 주요 버전을 거친 경우, .so주요 버전 변경은 일반적으로 호환되지 않는 ABI를 반영하므로 단독 버전을 갖는 것은 현명하지 않습니다. 버전이 지정된 라이브러리 파일만이 프로그램이 "성공적으로" 링크되는 것을 방지하며, 심볼릭 링크를 업데이트할 때 생성된 프로그램이 알 수 없는 방식으로 실패하게 만듭니다. (Windows에도 비슷한 문제가 있습니다. 오래된 DLL은 버전 제어를 사용하지 않는 경우가 많습니다.설치 프로그램은 종종 호환되지 않는 버전으로 교체합니다., "DLL 지옥"으로 이어집니다. )

README요구 사항이 무엇인지 확인하기 위해 (또는 이에 상응하는) 파일을 확인한 다음 실행하여 configure --help예상되는 폴백을 재정의할 수 있는지 확인합니다. 이는 프로그램을 올바른 라이브러리 버전에 바인딩하는 데도 도움이 됩니다.

관련 정보