두 공유 라이브러리 간의 이름 충돌을 어떻게 처리합니까?

두 공유 라이브러리 간의 이름 충돌을 어떻게 처리합니까?

내 Linux Mint 17.3 시스템에서는 패키지 libglfw2libglfw-dev.GLFW v3을 저장소에서 사용할 수 없기 때문에 지시어를 사용하여 수동으로 컴파일하기로 선택했습니다.여기.

온라인에서 찾은 거의 모든 지침에는 GLFW v2에 연결하려면 을 사용해야 하고 -lglfwGLFW v3의 경우 을 사용해야 한다고 나와 있습니다 -lglfw3. 그러나 이렇게 하면 -lglfw3오류가 발생합니다.

/usr/bin/ld: cannot find -lglfw3

사용할 때 다음과 같은 -lglfw오류가 많이 발생합니다 .

1.cpp:(.text+0x49): undefined reference to <function_name>

확실히 C_INCLUDE_PATH 및 LD_LIBRARY_PATH의 모든 경로가 정확합니다. 그러나 GLFW v2 패키지를 제거한 후 설치하여 apt-get실행 했는데 문제 없이 작동합니다 ldconfig. -lglfwCMake 파일 어딘가에 이름 충돌을 일으키는 버그가 있는 것 같습니다.

내 질문은: 동일한 이름의 공유 라이브러리를 제공하는 두 개의 소스가 있고 둘 다 필요한 경우 문제를 해결하기 위해 (빌드 구성을 자세히 조사하는 것 외에) 무엇을 할 수 있습니까? 파일 이름을 수동으로 안정적으로 변경할 수 있습니까 so?

답변1

예를 들어 공유 라이브러리는 이라고 불리며 libfoo.so-x.y.z, z사소한(완전히 이전 버전과 호환되는) 변경 사항에 대해 성장하고, y이전 버전과의 호환성을 유지하는 API 추가를 위해 성장하며, x주요 API 변경 사항(비호환)에 대한 변경 사항을 유지하는 것이 아이디어입니다. 실행 프로그램(예: 실행 파일의 출력 확인 )은 프로그램이 요청하는 라이브러리 와 해당 종속성을 충족하는 데 사용되는 라이브러리 ldd(1)( )를 주요 번호( )로 알려줍니다 . "Link "는 빌드 시 고정되고 시작 시 고정됩니다. 따라서 프로그램을 변경 하거나 계속 작동하도록 하고 동시에 설치하도록 할 수 있으며, 예를 들어 충돌 없이 둘 중 하나를 사용하여 일부 프로그램을 설치할 수 있습니다.libfoo.so.xlibfo.so.x.y.zlibfoo.so.xy.zyzlibfoo.so.3libfoo.so.4

라이브러리의 디렉토리를 살펴보면 일련의 기호 링크를 볼 수 있습니다. 예를 들어 링커 libfoo.so -> libfoo.so.x -> libfoo.so.x.y.z와 링크할 때 이를 따르고 실행 파일의 종속성으로 추가되어 기호를 확인하는 데 사용됩니다.-lfoolibfoo.so.xlibfoo.so.x.y.z

libfoo이 메커니즘은 레거시 애플리케이션에 이전 버전을 제공하면서 컴파일 타임에 항상 최신 버전을 얻도록 특별히 설계되었습니다 . 따라서 예를 들어 libbar.solibbar3.so(및 해당 심볼릭 링크 팜)이 버전 2( -lbar번호가 없는 이전 버전이 2인 경우) 또는 3( )에 대해 -lbar3빌드 할 수 있는 경우를 자주 볼 수 있습니다.

건설 기계~해야 한다이 문제를 해결하는 것은 가능하지만 매우 까다롭습니다(모든 사람이 최신 버전, 가장 빛나는 버전 3이 노후된 버전 2와 나란히 놓일 것이라는 생각에 열광하는 것은 아닙니다).

가장 좋은 방법은 배포판에 의존하여 이러한 혼란을 설정하는 것입니다.

관련 정보