2012-02-15 4 views
3

동적 라이브러리를 작성하는 방법을 파악하기 위해 기본 배열 래퍼 템플릿 클래스를 .o 파일로 컴파일하려고합니다. 그러나 소스를g ++에서 빈 오브젝트 파일을 생성합니다.

g++ -std=c++0x -c array.cpp 

으로 컴파일하면 결과 파일은 약 650 바이트에 불과합니다. 나는 나노를 사용하여 파일을 조사하고, 그것이 포함 된 유일한 기호는 C++ 11 편집의 기능 것 같다

00000001 r _ZStL13allocator_arg 
00000000 r _ZStL19piecewise_construct 

이었다 발견, 그들이있는 -std = C + +0 플래그를 사용하지 않고 컴파일 때와 같이 지나간. 명령

g++ -std=c++0x -o tester tester.cpp array.cpp 

으로 프로그램 테스트 코드를 모두 컴파일하려고

array.cpp에서 모든 것을 링커 오류를 생성하지만, 그렇지 않으면 깨끗하게 컴파일합니다.

나는 솔직히 이것으로 무슨 일이 벌어지고 있는지 전혀 모른다. array.cpp 및 array.hpp의 내용을 게시 할 수 있습니다.이 코드를 컴파일하는 방법보다는 내 코드 자체에서 문제가 있다고 생각하면됩니다.

+1

인스턴스가 생성되지 않은 템플릿을 컴파일하려고합니까? – ildjarn

+1

템플릿은 코드 생성 도구만큼 코드가 아닙니다. 실제 코드 만 컴파일됩니다. –

+0

tester.cpp에서 배열 으로 인스턴스화됩니다. 필자는 tester.cpp없이 컴파일을 시도하여 왜 .cpp에있는 모든 함수에도 불구하고 두 번째 (시간순으로 첫 번째) 컴파일 명령으로 링커 오류가 발생하는 이유를 알아 냈습니다. –

답변

8

그건 정상입니다. 템플릿은 을 인스턴스화 한 경우에만 코드로 나타나며 아직 완료하지 않았습니다. 템플릿 만 제공했습니다. 컴파일러가 템플릿을 컴파일하는 동안 템플릿 인수에 대해 실제 유형이 채워진 템플릿의 특정 인스턴스를 생성 할 이유가 없습니다.

나중에 컴파일러는 템플릿 유형을 사용하는 다른 소스 파일을 컴파일합니다. 인스턴스화도 발생하지 않습니다. 컴파일러에게 템플릿의 인스턴스를 다른 곳에서 찾을 것이라고 예상 할뿐입니다. 컴파일러는 객체 파일에이를 기록합니다. 그런 다음 링커는 컴파일러에서 찾아야하는 정의를 찾지 만 실패합니다.

그래서 헤더의 선언과 함께 인라인 템플릿에 대한 정의를 제공하는 것이 좋습니다. 그런 식으로 컴파일러가 템플릿을 사용할 때 헤더에서 본 정의를 사용하여 템플릿을 즉시 인스턴스화 할 수 있습니다. 여러 소스 파일에서 템플릿을 사용하는 경우 템플릿을 여러 번 인스턴스화하는 여러 정의로 끝날 수도 있지만 허용되며 링커는이를 처리하는 방법을 알고 있습니다.

대체 방법은 array.cpp 파일의 템플릿을 명시 적으로 인스턴스화하는 것입니다. 그러나 템플릿 멤버를 인라인으로 정의하는 것이 더 쉽습니다.

+0

매우 도움이 .. 이것을 찾으려면 많은 시간을 보냈습니다. – Tagar

+0

선언을 사용하여 템플릿의 인라인 선언을 제공하는 좋은 방법의 예를 제공 할 수 있습니까? –

+1

[문서의 주요 예] (http : // stackoverflow.com/documentation/c % 2b % 2b/460/templates/3999/basic-class-template # t = 201702250241383624287), @Warren. 구현은 즉시 선언을 따랐다. (같은 파일에서'main'이 존재하는 것은 무의미합니다.) –

0

array.cpp에 템플릿 만 포함되어있는 경우 별도로 컴파일하지 않고 array.hpp라고 부릅니다.

관련 문제