2013-05-08 2 views
7

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++ 버전의 목적은 무엇입니까? 이 과정에서 전혀 사용되지 않았습니까?

감사 인사.

+1

컴파일러/링커가 6.0.8을 선택하면 런타임 로더가 6.0.3을 선택합니다. 이것은 잘 끝나지 않을 수도 있습니다. 런타임 로더에게 라이브러리를 찾을 위치를 알려주려면 링커에게'-rpath/path/to/folder/to/folder/with/lib' 인수를 사용하십시오 (gcc/g ++에서 호출 될 때는'-Wl, -rpath ...'). 그런데 4.1.2는 몇 시간에 걸쳐 고대입니다. –

+1

http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html –

답변

9

GCC는 디렉터리 검색 목록에 따라 모든 라이브러리를 선택합니다. 다음과 같이 볼 수 있습니다 :

gcc -print-search-dirs 

목록에는 일반적으로 컴파일러 버전에 특정한 라이브러리가 있습니다.

그러나 링크 시간 선택은 런타임 선택과 같지 않을 수 있습니다.

-rpath 옵션이 포함 된 경우 (일부 툴체인 공급 업체는 비표준 툴을 포함 할 수 있음) 동적 링커는이를 사용하여 런타임에 올바른 라이브러리를 찾습니다. 그렇지 않으면 시스템은 기본 라이브러리를 사용합니다.

두 라이브러리가 잘 일치하지 않으면 나쁜 상황이 발생할 수 있습니다. C 라이브러리 (보통 glibc)는 항상 호환성을 유지하는 데주의를 기울였습니다. C++ 라이브러리는 항상이 사치를 누리지 못했습니다. 최근 몇 년 동안 더 안전했지만 많은 사람들은 여전히 ​​을 추천하지 않았습니다. 혼합 및 일치.

1

기본적으로 gcc는/usr/lib 경로의 라이브러리를 사용합니다.
1. gcc/g ++ 4.1.2는 최신 버전의 libstdC++. so.6.0.8에 링크되어 있지 않습니다.
2. g ++ 4.1.2는 링크 타임에 libstdC++ (6.0.3)의/usr/lib 버전을 선택했습니다.

명시 적으로 라이브러리 경로를 설정하지 않는 한 시스템 기본 libstdC++. so.6.0.3을 계속 사용합니다.

gcc/g ++ 4.1.2의 경우 libstdC++. so.6.0.8의 최신 버전을 사용하려면 컴파일하기 전에 라이브러리 경로를 내 보내야합니다.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/gcc4.1.2/lib 

이제 gcc/g ++ 4.1.2를 사용하여 링크 할 때 libstdC++. so.6.0.8이 사용됩니다.

관련 문제