2012-02-15 53 views
3

我正在嘗試將一個基本的數組包裝模板類編譯爲一個.o文件,試圖找出如何製作動態庫。但是,編譯源代碼時g ++生成空目標文件

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

生成的文件只有〜650字節。我研究了與納米該文件,並發現它含有唯一的符號是

00000001 r _ZStL13allocator_arg 
00000000 r _ZStL19piecewise_construct 

這似乎是C++ 11彙編的特徵,因爲當沒有-std =的C++ 0x標誌它們編譯不見了。

試圖編譯程序測試代碼和所有命令

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

產生鏈接錯誤,在array.cpp的一切,但,否則編譯乾淨。

我真的不知道這是怎麼回事。我可以發佈array.cpp和array.hpp的內容,如果你懷疑這是我的代碼本身的問題,而不是我如何編譯它。

+1

你想編譯一個沒有實際根據的模板? – ildjarn 2012-02-15 22:34:09

+1

模板不像代碼生成工具那樣多。只有實際的代碼被編譯。 – 2012-02-15 22:35:12

+0

它在tester.cpp中實例化,如數組;我只試圖在沒有tester.cpp的情況下進行編譯,以便弄清爲什麼儘管所有的函數都在.cpp中,但是爲什麼我要用第二個(按時間順序排列的第一個)編譯命令來獲取鏈接器錯誤。 – 2012-02-15 22:36:53

回答

8

這很正常。模板僅在實例化時纔會生成代碼,而您尚未完成此操作。你只提供了模板。當編譯器正在編譯模板時,它沒有理由生成模板參數填充的實際類型的模板的任何特定實例。

稍後,編譯器會編譯其他源文件,您可以在其中使用模板類型。這也不會導致實例化。它只是告訴編譯器它應該期望在其他地方找到模板的實例。編譯器注意到在對象文件中。鏈接器然後查找編譯器說應該找到的定義,但它失敗。

這就是爲什麼總是建議您在標題中爲您的模板提供與聲明內聯的定義。這樣,當編譯器看到你使用一個模板時,它可以使用它在標題中看到的定義立即實例化模板。如果您在多個源文件中使用模板,最終可能會多次定義模板實例,但這是允許的,並且鏈接器知道如何處理它。

另一種方法是明確實例化array.cpp文件中的模板,但只是內聯定義模板成員會更容易。

+0

非常有幫助..花了很多時間來找到這個。 – Tagar 2016-07-01 20:54:56

+0

您能否提供一個用聲明提供模板內聯聲明的好方法示例? – 2017-02-25 02:30:33

+1

請參閱[文檔中的主要示例](http:// stackoverflow。com/documentation/c%2b%2b/460/templates/3999/basic-class-template#t = 201702250241383624287),@Warren。宣言緊隨其後。 (同一個文件中「main」的存在與此無關。) – 2017-02-25 02:55:17

0

如果array.cpp僅包含模板,則不需要單獨進行編譯,您可能將其稱爲array.hpp。