2011-06-16 31 views
1

我有一個複雜的Makefile結構的大源目錄(包括地段等)GCC -E -dM給我的預處理器定義,但我希望它編譯

我想抓住預處理定義了GCC將在您運行時提供

gcc -E -dM。但是,我也想要構建源代碼。當我檢查make/build日誌時,我希望看到make運行的所有命令,以及來自源文件中的所有文件的#define,這些文件被傳遞給編譯器和/或重寫。

我不知道如何去做這件事。

對於如

如果有隻用這一條線foo.c文件裏

#define PI 3.14

運行的gcc -E -dM的foo.c將打印出所有的preprocessory定義到stdout,以及foo.c中的定義。

但它不編譯。我如何將命令組合起來以使這兩件事情都發生?

回答

3

你需要在兩遍中做到這一點,但你可以設置一個makefile規則來做到這一點,例如,編譯C代碼:

%.o: %.c 
    $(CC) $(CFLAGS) -dM -E $< > $<.dump # dump all preprocessor symbols to .dump file 
    $(CC) $(CFLAGS) -c $< -o [email protected]   # compile to .o as normal 

另外,如果你想構建分離和預處理,你可以有兩個規則,例如

%.o: %.c 
    $(CC) $(CFLAGS) -c $< -o [email protected]   # compile to .o as normal 

%.dump: %.c 
    $(CC) $(CFLAGS) -dM -E $< > $<.dump # dump all preprocessor symbols to .dump file 

您還需要假目標確保所有.c文件生成使用.dump文件。

+0

謝謝保羅!我會給這個鏡頭。 .dump文件在哪裏創建?我會從我跑過的地方(頂層)發現它嗎? – Rohan 2011-06-17 16:31:36

+0

@Rohan:應該和.c文件在同一個目錄 – 2011-06-17 16:33:02

+0

謝謝保羅。這對我用簡單的foo.c文件創建的一個小例子非常有效。我試圖解決的問題稍微複雜一些。我有一個帶有.c文件的文件夾,但編譯成.o的文件正在不同的make文件中處理。我只是嘗試了你給我的解決方案的第一部分(用-dM開關等),但規則似乎沒有觸發,因爲現在在這種情況下,我不關心編譯本身,因爲它的存在已搞定。 我應該如何修改上述規則,使其在所有.c文件的感興趣文件夾中運行,併爲我提供這些符號? – Rohan 2011-06-22 20:51:34

相關問題