[英]Automatic recompile on compiler flag change
當我調試和優化我的一個C / C ++項目時,我經常禁用並啟用分析標志-p -g -pg
和我的Makefile中的一些優化標志,以便更好地了解發生的事情。
但是, GNU make
沒有檢測到這種變化,也沒有進行重新編譯。
如何正確地重建一個整個軟件項目與一些新標志(或一些刪除),而無需手動make clean
?
作為對Stefan上述響應的建議調整,您可以將構建配置分解為單獨的文件。 您可以將此配置文件的名稱列為您用於構建代碼的所有makefile規則的先決條件(即冒號右側),而不是以某種方式強制 - 在您的代碼中包含此文件。
我們要做的基本事情是讓每個對象都依賴於配置文件。
作為c / c ++的一個有點瘋狂的解決方案,可以使用下面的文件,它是makefile和c / c ++的正確語法。
我沒有在Makefile本身中擁有所有編譯器標志,而是創建了以下文件“Makefile_flags”:
#undef DUMMY
#define DUMMY /*
PROFILING_FLAGS = -p -g -pg
OPTIMIZATION_FLAGS = -O3
COMPILE_FLAGS = -Wall -Wextra -Wuninitialized -Wmissing-declarations \
-Wshadow -ftrapv -Wfloat-equal -Wundef -Wpointer-arith \
-Wcast-align -Wunreachable-code -Wold-style-cast \
-Wformat=2 -Winit-self -Werror-implicit-function-declaration \
-Wredundant-decls -Wunsafe-loop-optimizations \
-pedantic -MD -MP
CPP_STD_FLAGS = -std=c++0x
COMPILE_FLAGS += $(CPP_STD_FLAGS)
COMPILE_FLAGS += $(PROFILING_FLAGS)
COMPILE_FLAGS += $(OPTIMIZATION_FLAGS)
LINKING_FLAGS = $(COMPILE_FLAGS)
#foo */
現在編寫 - 在-include Makefile_flags
中包含Makefile_flags,並在要更新的源代碼的每個文件中包含#include "Makefile_flags"
(例如,在每個* .c / * .cpp文件中)。
這個解決方案的#foo */
:Makefile使用#
作為注釋符號,因此#undef DUMMY
, #
#foo */
#define DUMMY /*
和#foo */
在這里沒有效果。 但是,在C / C ++中, /*
用於多行注釋。 因此,編譯器忽略整個非C代碼,Makefile不會看到未知符號/*
。 此外,預處理器指令#undef DUMMY
負責兩次不執行#define DUMMY
,並且#foo
語句位於多行注釋內。
但缺點是,必須將其包含在每個文件中。
確保您擁有文件“Makefile_flags”的正確相對路徑。
正是這個問題的解決方案內置於makepp中 。 這會自動檢測並考慮所有依賴關系,並且更改的命令當然是其中之一。
如果可能,您可以使用更智能的構建系統。 我使用SCons ,它有這樣的東西建立它。 它還具有很好的功能,例如自動掃描文件的頭部依賴性,因此您不必手動保持最新或運行20個自動工具。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.