2013-03-15 27 views
2

我有舊的大代碼庫,因爲我只需要一小部分功能,用於自動檢測所需的.cpps(假設它們位於相同的文件夾中,並且與.h文件具有匹配的名稱)。
不幸的是,我仍然需要很多代碼,所以手工通過代碼是不可能的。 是否有工具會從我的「main.cpp」中遞歸併遞歸地找出所需的所有.h文件,以便我可以簡單地替換字符串(.h - > .cpp)並將其提供給編譯器。有沒有自動化的方式來檢測我應該編譯的.cpp源文件(取決於#include * .h)

+3

是否有理由不只是編譯它,讓鏈接器拉入你實際使用的符號?如果您不修改原始代碼庫,則只需執行一次。 – JBentley 2013-03-15 17:45:45

+0

編譯需要2分鐘,exe是7 MB ... – NoSenseEtAl 2013-03-15 18:37:28

+1

鏈接器(通常)只會將代碼放入程序實際使用的.exe中,因此,是否編譯額外的東西並不重要 - 如果它只是2分鐘,那麼甚至不用擔心它,只需編譯一次,不要再重新編譯它,並讓鏈接器將它整理出來。 – JBentley 2013-03-15 19:24:45

回答

4

大多數編譯器可以爲你做這個,例如GCC和Clang提供-M-MM來列出源文件的所有依賴關係。還有其他選項可以排除系統頭文件等。有關更多信息,請參閱您的編譯器文檔,如果您需要幫助,請告訴我們您正在使用的編譯器。但是,你的方法有一個問題:你可以計算出main.cpp包含的頭文件,沒問題,但是如果你想爲頭文件編譯相應的.cpp文件,這些實現文件通常需要其他頭文件並非直接或間接包含在main.cpp中,您還需要這些標頭的.cpp文件。沖洗並重復。 :)

如果手動迭代找到.cpp文件的過程是不是一種選擇,你可以使用一個Makefile:

CPPFILES := $(wildcard *.cpp) 
DEPFILES := $(CPPFILES:%.cpp=%.d) 

%.d: %.cpp 
    g++ -MM $< -o [email protected] 

include $(DEPFILES) 

%.o: %.cpp 
    @echo "[email protected]" 

%.h: %.o 
    @: 

然後調用

make main.o 

,並讓讓搞清楚哪些其他文件是必需的。上述當然是一個簡化的例子,你可能有一個更復雜的目錄結構,你可能需要爲g++添加一些編譯選項,但我希望這是一個開始。

+0

雖然看起來有可能「main.cpp」可能'#include「featureA.h」',然後「featureA.cpp」具有'#包括「功能B. h「'...... – aschepler 2013-03-15 18:25:59

+0

@aschepler:葉普,我也注意到並編輯了答案,指出了OP。 – 2013-03-15 18:28:10

+0

即時通訊使用g ++/clang ++,但像你說的問題仍然是我有一堆.cpps可能需要其他.h。 – NoSenseEtAl 2013-03-15 18:39:19

1

將您的代碼庫編譯爲靜態庫(Windows上的.lib)。除非您修改代碼庫,否則只需要執行一次操作即使這樣您只需重新編譯更改的代碼即可。

在您的可執行項目中,包含您正在使用的任何標題,並將該庫包含在鏈接器設置中。鏈接器只會將您的可執行文件實際使用的已編譯定義(從靜態庫中的目標文件)鏈接到最終的.exe文件中。

相關問題