2015-02-05 1 views
-1

컴파일러가 미리 컴파일 된 라이브러리를 사용하는 경우 어떻게해야하는지 알지 못합니다. 예를 들어, 내 프로그램컴파일러는 사전 컴파일 된 라이브러리를 어떻게 사용합니까?

#include <vector> 
#include <iostream> 

int main() 
{ 
    std::vector<int> V = {1, 69, 111}; 
    for (std::vector<int>::iterator it(V.begin()), offend(V.end()); it != offend; ++it) 
     std::cout << *it << std::endl; 
    return 0; 
} 

분명히 std::vector 그 간단한 프로그램에 대한 잔인한 가정하자. 그러나 컴파일러가 std::vector이 C++ 언어로 구현 된 방법을 모른다면 어떻게 알 수 있습니까?

+1

아마도 링커에 대해 물어볼 것입니다. 만약에 당신이 당신이 묻고있는 것을 찾는 데 도움이되는 것을 읽는다면보십시오. :) [Linker wikipedia] (http://en.wikipedia.org/wiki/Linker_ (computing)) – ben

+0

정적으로 링크 된 라이브러리와 동적으로 링크 된 라이브러리에 익숙하십니까? 해당 주제에 대한 정보를 얻으면 질문이 명확해질 수 있습니다. – Lionel

답변

3

예제에는 "미리 컴파일 된 바이너리"가 없을 것입니다. 그러나 standard C++ library (cout<vector>과 같은 헤더에 대한 작업을 제공합니다)를 사용하고 있습니다. 소프트웨어 libraries에 대해 더 자세히 읽어보십시오 (실제로 Linux의 libstdc++.so 공유 라이브러리는 컴파일 된 바이너리 형식입니다).

당신은 #include <vector> 다음 당신이 그렇게 컴파일러는 & 기능 ( std::vector<int>에 필요한) 일부 클래스를 정의하고 관련 코드를 방출한다 std::vector<int>를 사용하여 C++ template을 instanciating되어 있습니다.

compilerslinkers에 대해 자세히 알아보십시오. Levine's book on Linkers & loaders; GCC의 문서는 또한 당신은 (아마도 파일 yoursource.cc에서) 프로그램의 preprocessed 형태의 내부 보일 수 있습니다, BTW template instantiation

에 장을 가지고있다. GCC를 사용하여
g++ -Wall -C -E yoursource.cc > yoursource.ii와 해당 소스 코드를 컴파일 할 경우 컴파일러는 실제로

1

내 생각을 "보는"것과 매우 유사하다 (매우 큰) yoursource.ii 생성 된 파일, 내부보고 에디터 나 호출기를 사용 너는 precompiled headers을 생각하고있다. 라이브러리는 이전에 컴파일되거나 어셈블 된 오브젝트 파일 세트로 구성됩니다. 앞서 언급했듯이 템플릿은 헤더로 포함 된 소스 코드의 한 형태입니다.

+0

OP가 미리 컴파일 된 헤더를 생각하고 있다고 생각하지 않습니다. –

+0

@BasileStarynkevitch -하지만 OP의 예에서는 헤더 인 vector 및 iostream을 사용합니다. – rcgldr

+2

실제로 OP는 머리글을 사용하지만 실제로는 미리 컴파일 할 생각이 없습니다. 그는 아마도 전처리 기가 실제로하는 일을 완전히 이해하지 못하고있을 것입니다. "precompiled libraries"는'libstdC++. so'를 가리킨다. –

관련 문제