2009-08-22 2 views
5

보통 제 3 자 (비표준) C++ 라이브러리의 코드 (헤더 포함)를 사용할 때 미리 빌드 된 바이너리 파일이 내 응용 프로그램을 나타내는 대상 실행 파일에 링크되거나 포함되어 있지만 C++ 표준은 어떻게됩니까? library ?, 지금까지 C++ 표준 라이브러리의 코드 만 사용하는 라이브러리를 제공 할 필요가 없으므로 코드가 정적으로 링크되어 실행 파일에 포함됩니까?C++ 표준 라이브러리가 내 응용 프로그램과 어떻게 링크되어 있습니까?

답변

11

아니요, 표준 라이브러리는 기본적으로 런타임에 동적으로 연결됩니다.

동적 로더를 실행하면 동적 라이브러리가로드되고 실행되면 동적 라이브러리를위한 몇 가지 표준 위치가 표시됩니다. 그렇지 않으면 응용 프로그램이 종료됩니다. 유닉스 시스템에

:
이 는/usr/lib 디렉토리 :을 찾습니다 된 libstdC++ *

Windows에서

:

도 몇 있습니다 MSVCRT.DLL

: \ Windows \ System32 폴더의 모양을
C 검색 경로에 영향을 줄 수있는 환경 변수 dlopen에 대한 플랫폼 맨 페이지를보고 그 내용을 확인하십시오. 플랫폼에있는 dlopen의 매뉴얼 페이지에 필요한 모든 것이 있어야합니다.

대부분의 시스템에는 적절한 위치에 이러한 라이브러리가 있으며 자동으로 검색됩니다.
나머지 STL은 추가 공유 lib 종속성을 도입하지 않습니다.

+2

디렉토리는'c : \ windows \ system32'입니다. 최소한 Visual Studio의 런타임이 유지됩니다. 나는 MinGW가 그들에게 링크한다고 생각하지 않는다. – avakar

+3

그리고 mingw는 표준 C++ 라이브러리에 앱을 정적으로 연결합니다. – nos

+4

이 답변은 완전히 정확하지 않습니다. libstdC++는 MSVCRT.DLL과 다릅니다. 후자는 * c * 라이브러리이고, 전자는 * C++ * 라이브러리입니다. MinGW에 의해 생성 된 모든 바이너리는 MSVCRT.dll에 의존 할 것이지만, 실제로 묻는 질문과 관련이 없습니다. 앞서 지적한 바와 같이 libstdC++ 라이브러리는 기본적으로 실행 파일에 정적으로 링크되어 있습니다. –

1

대부분이 헤더 파일에 있습니다. 템플릿 파일이 너무 많이 만들어 졌기 때문입니다. 약간은 libstdc++.so (iostream 일 수도 있습니다.)

+2

STL은 대부분 헤더 파일입니다. 표준 라이브러리에는 다른 것들이 포함됩니다. –

+0

모든 C++에는 libstdC++가 필요합니다. 여기에는 표준에서 요구되는 몇 가지 필수 기능이 있습니다. –

3

MinGW C++ 프로그램 에 대한 유일한 기본 런타임 의존성은 MSVCRT.DLL입니다. 다른 의존성은 프로그램이 실제로하는 일에 달려 있습니다. 예를 들어 ODBC 데이터베이스 연결을 사용하는 경우 은 ODBC32.DLL (및 다른 Windows DLL)에 종속됩니다. 그러나 MinGW C++ 프로그램에서 std :: string 또는 std :: vector와 같은 클래스를 사용하면 새로운 동적 라이브러리 의존성이 도입되지 않습니다. 동적 라이브러리 의존성에 대해 고민하는 경우에

은 최근는 MinGW에서 http://www.dependencywalker.com/

6

에서 도구 "종속성 워커"체크 아웃의 gcc/g ++ 버전 (4.40) 당신은 오히려 정적 기본보다 공유 DLL에 링크 할 수 있습니다 라이브러리 - 플래그 -shared-libstdC++를 사용하여.

정적 버전의 라이브러리는/mingw/lib/gcc/mingw32/[gcc 버전]에 있습니다. 파일 이름은 libstdC++입니다. 이것은 MinGW로 C++ 응용 프로그램을 컴파일 할 때 기본적으로 링크됩니다.

+3

MinGW의 기본값이 변경된 것 같습니다. 적어도 내 시스템에서는 기본적으로 libstdC++ - 6.dll을 연결합니다. '-static-libstdC++'플래그로 비활성화 할 수 있습니다. – rustyx

+0

@rustyx 알아두면 좋을 것 같습니다. 필자는 대답을 편집하여 자유롭게 답변을 작성하고 응답을 upvote로 보내어 위로 올릴 수 있습니다. –

+0

@rustyx -static-libstdC++ (및 -static-libgcc)을 시도했지만 아직 내 프로그램은 mingw libstd * .dll 라이브러리. 나는 왜 크로스 컴파일, 어떤 생각? –

1

C 및 C++ 런타임 라이브러리는 일반 라이브러리와 동일한 방식으로 링크되지만, 주요 차이점은 대개 컴파일러와 링커가 자동으로 컴파일하고 링크 할 필요가 없다는 것입니다.

그러나 일반화하면 응용 프로그램과 함께 제공 할 필요가 없습니다. 동적 링크 바이너리를 제공하는 대부분의 경우, MSVC++로 컴파일하는 경우와 같이 빌드 시스템에 설치된 것과 링크됩니다. 새 Windows 설치에서 동적으로 링크 된 바이너리를 설치하면 라이브러리가 설치 팩의 일부로 포함되지 않는 한 문제가 발생할 수 있습니다 (Visual Studio 재배포 가능 파일에 대한 설명서 참조). Solaris 시스템에서도 마찬가지입니다 (표준 라이브러리는 패치 세트의 일부로 업그레이드됩니다).리눅스에서는 GPL 때문에 정적으로 링크 할 수 없지만 라이브러리는 일반적으로 배포 패키지를 통해 설치됩니다.

+0

좋은 답변이지만, 표준 라이브러리를 정적으로 연결하는 mingw에 대해 이야기하고있었습니다 ... – Lawand

관련 문제