2011-05-12 118 views
2

我有一組使用gcc和make編譯的C文件。構建過程正常工作。 我想知道如果我可以在編譯期間獲得一個包含所有源代碼但沒有任何預處理器宏的C文件。編譯多個源文件時創建一個C文件

+2

爲什麼你需要這個?你想要解決什麼實際問題? – 2011-05-12 11:03:40

+0

我正在嘗試爲C構建一個特定用途的靜態分析器。因此,我想收集一個文件中的所有源以簡化對具有多個文件的複雜項目的分析。 – 2011-05-15 07:38:44

回答

1

如果包括在gcc編譯器中的所有文件一次,你可以使用

gcc -E main.c other.c another.c 

這也將包括可能使用stdlib函數-nostdinc

+0

-E選項正常工作。非常感謝 ! – 2011-05-15 07:35:40

0

你不能 - 通常你會調用編譯器來編譯一個源文件,產生一個目標文件。稍後,您將調用所有目標文件的鏈接器來創建可執行文件 - 它沒有可用的原始C源代碼。

但是,您可以創建一個單獨的shell腳本,該腳本用於調用gcc的-E選項僅用於預處理源文件,然後使用cat實用工具將所有源放入單個文件中。

+2

使用gcc'-E'選項只執行文件的預處理 – CodeButcher 2011-05-12 08:25:18

+0

@CodeButcher:謝謝,更新了我的答案。 – 2011-05-12 08:27:12

0

您可以使用-save-temps選項來獲取中間輸出。但是,它將是每個源文件的一個輸出文件。每個源文件分別編譯並表示一個不能混合的編譯單元。
您也可以使用-E選項,但只能運行預處理器而不能繼續編譯。

2

一個簡單的做法是製作一個包含所有其他源文件的文件。

$cat *.c > metafile.c 

這將構建一個這樣的文件,這取決於你如何設置你「編譯一次」和IFNDEF的這個文件很可能無法編譯自身。

在另一方面,如果你想在一個文件中,所有的預處理器宏的已展開和評估,那麼答案是添加以下的gcc什麼:

-save-temps

然後將該文件。②將包含展開和評估宏

+0

+1,但應該是'> metafile.c',而不是'> metafile.cpp' – 2011-05-12 09:24:00