2011-06-20 71 views
1

因此,這是一個比任何設計問題更多的問題,儘管有關g ++鏈接器的任何信息都會很棒。C++鏈接器設計問題

我有嵌入在以下結構.cpp文件:

Main 
Main/Utilities 
Main/Utilities/Data 

當我編譯主的主入口點的.cpp,我指定所有.cpp文件的任何鏈接的.cpp曾經使用 - 這對我的測試項目來說工作得很好,它只有5個鏈接文件,但是這個項目將會非常快速地增長,這顯然是不可行的。有沒有辦法解決這個問題?這是什麼造成的?

我試過使用「g ++ * .cpp」,但它希望我仍然鏈接其他人。我必須做一些事情,比如「g ++ main.cpp Utilities/other.cpp Utilities/Data/data.cpp」。 other.cpp使用data.cpp,main.cpp使用other.cpp。在編譯other.cpp時,我必須像以前一樣指定data.cpp。

非常感謝您的任何想法或幫助!

+0

我想你有一些術語混淆。 'g ++'是C++編譯器,而不是鏈接器。但是,爲了您的利益,它將使用正確的參數調用背景中的鏈接器(在大多數UNIX系統上將會是'ld')。 –

回答

0

...我有指定所有.cpp文件的任何鏈接的.cpp曾經使用...

這是錯誤的。您必須向鏈接器提供足夠的信息來解析代碼中使用的所有符號,但您可以將其作爲源代碼文件(.cpp等),目標文件(.o)或庫(.so或。一個)。將每個源代碼文件編譯爲目標文件就足夠了,然後將每個目標文件鏈接在一起以創建二進制文件。

g++ foo.cpp -c -o foo.o 
g++ bar.cpp -c -o bar.o 
g++ main.cpp -c -o main.o 
g++ main.o foo.o bar.o -o main.exe 
3

管理一個大項目的一般方法是使用正確的目錄結構(就像你已經到位的一個),然後將一個Makefile在每個目錄。頂級Makefile應遞歸調用所需的Makefiles。每個Makefile應指定要從該目錄編譯的源文件(以及其他編譯標誌,如果需要的話)。理想情況下,您應該根據您的要求製作靜態庫(或者可能是動態的)。一旦你編譯了所有的相關代碼(意味着你有.lib.o文件),那麼你應該編譯具有入口點的源文件(例如在c/C++中的main函數)並指定從屬庫到鏈接器(ld )。

舉個例子,看看至少有2級目錄結構的開源項目。

0

我假設你實際上在UNIX(like)系統上,所以shell會將*.cpp通配符規範替換爲實際的文件名。其他系統可能會有不同的表現,但我懷疑它。

您已經將文件存儲在目錄結構中,因此只需簡單地說*.cpp只會匹配當前目錄中調用g ++的文件 - 在您的情況下大概只是main.cpp。

如果您想要覆蓋所有其他帶有通配符的文件,您也必須在命令行中指定它們。在你的情況下:

g++ *.cpp Utilities/*.cpp Utilities/data/*.cpp 

如果這實際上比簡單地命名所有文件更容易,我不能判斷。

編輯:正如其他人所說,編譯/構建非平凡程序的最佳方式當然是使用make或一些類似的構建工具。