g ++에서 라이브러리의 "시스템"버전이 다른 경우 libstdC++의 버전과 해당 링크의 의미를 이해하려고합니다. . 앞으로 ABI에 대한 이해에컴파일러 libstdC++ 버전 대 시스템 버전
-rwxr-xr-x 1 root root 4397810 May 18 2007 /opt/gcc4.1.2/lib/libstdc++.so.6.0.8
을 바탕으로 : 나는 GCC/G ++ 4.1.2의 ABI Guidelines 문서에 따라 어떤 사용하고
가 된 libstdC++ so.6.0.8, 충분한 확인을 포함 -compatibility, g ++ 4.1.2로 빌드 할 수 있으며 이전 버전의 libstdC++ 6.0.8 이상을 사용하는 시스템에서 코드가 실행될 것으로 기대합니다. 이는 이전 버전의 ABI . 동일한 시스템에
는 이전 버전이 된 libstdC++의는/usr/lib 디렉토리 :
내가이 시스템에서 g ++ 4.1.2를 사용하여 코드를 컴파일 할 경우, 다음을 ldd를-rwxr-xr-x 1 root root 804288 Jul 22 2005 /usr/lib/libstdc++.so.6.0.3
, 내가의 버전을 확인 된 libstdC++의는/usr/lib 디렉토리 6.0.3 인, 참조 :는/usr/lib에 먼저 체크로
# ldd test
.
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x005b6000)
.
이가 예상된다. 그리고 응용 프로그램이 잘 실행됩니다.
내 질문은 : 여기에 무슨 일이 일어 났습니까?
g ++ 4.1.2가 libstdC++ 버전과 링크되었으므로 해당 릴리스 (6.0.8)의 일부입니까? 그렇다면 실행 파일이 이전 ABI를 가지고있는 런타임에서/usr/lib의 이전 버전을 어떻게 사용할 수 있습니까? 운?
또는 런타임시 실행 파일과 동일한 방법으로 라이브러리 경로를 결정하기 때문에 g ++ 4.1.2에서 링크 시간에 libstdC++ (6.0.3)의/usr/lib 버전을 선택하여 사용했습니다. libstdC++가 "자체"버전이 아니더라도 g ++이 그렇게 할 수 있습니까? g ++ 4.1.2 (6.0.8)에서 libstdC++ 버전의 목적은 무엇입니까? 이 과정에서 전혀 사용되지 않았습니까?
감사 인사.
컴파일러/링커가 6.0.8을 선택하면 런타임 로더가 6.0.3을 선택합니다. 이것은 잘 끝나지 않을 수도 있습니다. 런타임 로더에게 라이브러리를 찾을 위치를 알려주려면 링커에게'-rpath/path/to/folder/to/folder/with/lib' 인수를 사용하십시오 (gcc/g ++에서 호출 될 때는'-Wl, -rpath ...'). 그런데 4.1.2는 몇 시간에 걸쳐 고대입니다. –
http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html –