我有舊的大代碼庫,因爲我只需要一小部分功能,用於自動檢測所需的.cpps(假設它們位於相同的文件夾中,並且與.h文件具有匹配的名稱)。
不幸的是,我仍然需要很多代碼,所以手工通過代碼是不可能的。 是否有工具會從我的「main.cpp」中遞歸併遞歸地找出所需的所有.h文件,以便我可以簡單地替換字符串(.h - > .cpp)並將其提供給編譯器。有沒有自動化的方式來檢測我應該編譯的.cpp源文件(取決於#include * .h)
回答
大多數編譯器可以爲你做這個,例如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++
添加一些編譯選項,但我希望這是一個開始。
雖然看起來有可能「main.cpp」可能'#include「featureA.h」',然後「featureA.cpp」具有'#包括「功能B. h「'...... – aschepler 2013-03-15 18:25:59
@aschepler:葉普,我也注意到並編輯了答案,指出了OP。 – 2013-03-15 18:28:10
即時通訊使用g ++/clang ++,但像你說的問題仍然是我有一堆.cpps可能需要其他.h。 – NoSenseEtAl 2013-03-15 18:39:19
將您的代碼庫編譯爲靜態庫(Windows上的.lib)。除非您修改代碼庫,否則只需要執行一次操作即使這樣您只需重新編譯更改的代碼即可。
在您的可執行項目中,包含您正在使用的任何標題,並將該庫包含在鏈接器設置中。鏈接器只會將您的可執行文件實際使用的已編譯定義(從靜態庫中的目標文件)鏈接到最終的.exe文件中。
- 1. #include .h或.cpp文件?
- 2. #include所有.cpp文件到單個編譯單元中?
- 3. 編譯沒有相應頭文件的cpp
- 4. GNU編譯使所有的.cpp文件.O和包括.h文件
- 5. 遞歸的文件夾添加cpp文件編譯來源
- 6. 我應該在.cpp或.h文件中包含頭文件?
- 7. 有沒有辦法在解決方案中的每個.cpp和.h文件上調用clang格式?
- 8. 從.h文件生成.cpp源文件
- 9. 是否有自動的方式來改變項目的源文件的編碼?
- 10. 編譯時解決方案來檢測特徵對象沒有eval()成員?
- 11. 從.h和.cpp進行條件編譯
- 12. @include中的SASS分區沒有編譯
- 13. Android.mk將編譯.c的源代碼,但沒有的.cpp
- 14. 有沒有辦法確保C++ .h與相應的C++ .cpp文件匹配?
- 15. cuda文件組織的有效方式:.cpp .h .cu .cuh .curnel文件
- 16. 我應該用C++分開cpp和h文件嗎?
- 17. Appengine沒有編譯我的.jspx文件
- 18. .h文件存在,但沒有.cpp文件
- 19. 所有.cpp文件都依賴於兩個.h文件?
- 20. 沒有cmake的編譯源
- 21. 編譯/鏈接CUDA和CPP源文件
- 22. 有沒有一個應用程序來自動格式化CSS文件?
- 23. 有沒有檢測文件擴展名的原生方式?
- 24. 有沒有變通的方式來編譯在Microsoft Visual C++
- 25. 任何方式列出用於編譯每個cpp文件的頭文件?
- 26. 有沒有好的開源軟件來編寫測試用例?
- 27. 有沒有一種編程方式來檢查.sql文件中的語法?
- 28. 是否有跨平臺的方式來檢測調試模式編譯?
- 29. CPP | .h文件(C++)
- 30. 我應該總是將我的文件分割成聲明(.h)和定義(.cpp)
是否有理由不只是編譯它,讓鏈接器拉入你實際使用的符號?如果您不修改原始代碼庫,則只需執行一次。 – JBentley 2013-03-15 17:45:45
編譯需要2分鐘,exe是7 MB ... – NoSenseEtAl 2013-03-15 18:37:28
鏈接器(通常)只會將代碼放入程序實際使用的.exe中,因此,是否編譯額外的東西並不重要 - 如果它只是2分鐘,那麼甚至不用擔心它,只需編譯一次,不要再重新編譯它,並讓鏈接器將它整理出來。 – JBentley 2013-03-15 19:24:45