2010-07-03 4 views
0

필자가 작성한 일부 템플릿 클래스는 컴파일해야하는 다른 클래스에 대한 종속성입니다. 난 내 메이크에서이 작업을 수행 할 수있는 방법에 관한 몇 가지 옵션이 있습니다템플릿을 컴파일하거나 템플릿을 사용하여 컴파일하는 올바른 절차는 무엇입니까?

  1. 템플릿을 필요로하는 각 클래스는 템플릿 요구 사항을 나열합니다. 이것은 새로운 클래스를 추가 할 때마다 의존성 트리를 재 작성해야한다는 단점이 있습니다.

  2. 어떻게 든 타겟팅 할 템플릿을 만듭니다. 컴파일하거나 아무 것도 컴파일하지 않는 그림자 종속성 트리를 만들어 템플릿 중 하나가 수정되는 경우 강제로 다시 컴파일하면됩니다.

모든 의견을 환영합니다.

+4

Make는 클래스를 다루지 않으며 파일을 처리합니다. 다른 헤더 파일처럼 템플릿을 포함하는 파일을 처리합니다. –

+0

필수 파일로 나열 하시겠습니까? – Alex

+2

"필수 파일"이 무슨 뜻인지 몰라 - make는 그런 개념이 없다. 당신은 일반적으로 의존성을 만들 것입니다. –

답변

1

이 파일 거래를합니다. foo.cppbar.h이 있다고 가정 해 보겠습니다. 후자에는 템플릿이 포함되어 있습니다. 그리고 전자는 예를 들어, 할 수 있습니다

#include "bar.h" 
class Foo : public Bar<Widget> { [...] }; 

당신의 Foo 클래스가 상속 및 따라서 귀하의 Bar 템플릿 클래스에 따라 다르지만, 당신은 또한 이미 #include들과 파일 종속성을 선언한다.

그것은 당신이 당신의 메이크 파일에서 지정한 것과 동일한 파일 종속성입니다 :이 규칙에 대한

foo.o: foo.cpp bar.h 
     g++ -I. -o foo.o foo.cpp 

을 만들 사용자가 지정한 명령이 foo.cppbar.h 파일을 기반으로, foo.o를 만들 것으로 기대하고있다. 이미 foo.o을 한 번 빌드하고 이러한 종속성이 변경되지 않은 경우 make는 규칙을 건너 뛸 수 있음을 알고 있습니다.

파일 종속성을 두 번 지정하는 것이 지루한 것처럼 보일 수도 있지만, -M 명령 줄 매개 변수를 사용하여 소스 코드에서 #include에서 GCC로 Makefile의 종속성을 자동으로 생성 할 수 있습니다. 이 내용은 gcc(1) 맨 페이지에서 읽을 수 있습니다. 간단히 GCC의 출력을 가져 와서 대체로 어딘가에 저장하십시오. 보통 Make32에서 foo.dinclude입니다.

일부 마법을 사용하면 응용 프로그램을 빌드하는 동일한 Makefile에서 *.d 종속 파일 생성을 자동화 할 수 있습니다.

1

옵션 2에서 g ++를 사용하여 템플릿 인스턴스화를 컴파일 할 수 있습니다.

// my_class.hpp 
template <typename T1, class Container, typename Compare> 
class my_class { 
    // ... 
}; 

및 코드에서 당신은 my_class<long, std::vector<long>, std::greater<long> >를 사용 : 예를 들어, 한 가정합니다. 당신이 오브젝트 파일로 my_class<long, std::vector<long>, std::greater<long> >의 인스턴스를 컴파일 할 수 있습니다 ++ g으로 : 어떤 대상이 my_class_long_long_vector_greater_instantiation.o에 따라

my_class_long_long_vector_greater_instantiation.o: my_class.hpp 

경우와 선언 : 하단 근처에 Makefile에,

// my_class_long_long_vector_greater_instantiation.cpp 
#include "my_class.hpp" 

template class my_class<long, std::vector<long>, std::greater<long> >; 

그런 다음 추가 템플릿 my_class이 변경되었습니다 (my_class.hpp 파일이 변경됨). 그러면 GNU make가 my_class_long_long_vector_greater_instantiation.cpp을 다시 컴파일하므로 my_class<long, std::vector<long>, std::greater<long> >을 다시 인스턴스화합니다.

은 참조 : 닐 버터 워스 코멘트에서 언급 한 바와 같이 Where's the Template?

+0

나는 그것을 좋아한다. 나는 이것이 효과가 있다고 생각한다. – Alex

관련 문제