2010-07-03 98 views
0

我寫了一些模板類,它們是我需要編譯的其他幾個類的依賴項。我有幾個選項,我怎麼能在我的Makefile做到這一點:什麼是編譯模板和/或編譯模板的正確過程?

  1. 每個需要一個模板類列出了它的模板要求。這有每次我想添加一個新類時需要重新創建依賴關係樹的缺點。

  2. 以某種方式使模板成爲目標。要麼編譯它們,要麼製作一些不編譯任何東西的影子依賴樹,但只是在其中一個模板被修改時強制重新編譯。

歡迎任何建議。

+4

Make不處理類,它處理文件。您會像處理其他頭文件一樣處理包含模板的文件。 – 2010-07-03 17:49:51

+0

在列表中它是一個必需的文件? – Alex 2010-07-03 17:59:00

+2

我不知道你的意思是「所需文件」 - make沒有這樣的概念。你通常會使它成爲一個依賴項。 – 2010-07-03 18:01:13

回答

1

尼爾·巴特沃思在評論中提到,讓涉及的文件。假設你有foo.cppbar.h。後者包含你的模板。而前者可能會做,例如:當你Foo類繼承,因此要看你Bar模板類

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

,你也已經與#include方法的聲明文件的依賴。

這是您在Makefile中指定的同一文件的依賴性:

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

對於此規則,讓期待您指定的命令創建foo.o的基礎上,foo.cppbar.h文件。如果您已經構建了foo.o一次,並且這些依賴關係沒有更改,請知道它可以完全跳過該規則。

兩次指定文件依賴關係似乎很乏味,但幸運的是,Makefile中的依賴關係可以通過GCC使用-M命令行參數從源代碼中的#includes中自動生成。您可以在gcc(1)聯機幫助頁面閱讀這方面的內容。只需將GCC的輸出保存在某個地方,通常在您的Makefile中爲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> >。隨着G ++就可以編譯my_class<long, std::vector<long>, std::greater<long> >實例化到一個目標文件:

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

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

然後,在你Makefile接近底部添加:

my_class_long_long_vector_greater_instantiation.o: my_class.hpp 

如果任何目標取決於my_class_long_long_vector_greater_instantiation.o,並申報模板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 2010-07-03 18:07:29