簡體   English   中英

自動重新編譯編譯器標志更改

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM