2011-01-09 35 views
3

可以從程序內部訪問編譯了c/C++程序的gcc編譯器開關嗎?從內部C/C++程序訪問GCC編譯器開關

在我的應用程序中,作爲日誌信息的一部分,我想編寫程序編譯時使用的哪些開關,例如編譯器的優化和預處理器變量輸入。

回答

6

不以任何標準方式。

它通常是構建系統,它將在構建到應用程序中的版本字符串中生成這樣的內容(但它們都不是自動的)。

4

作爲Martin答案的補充:作爲這種技術的一個例子,您可以看看Vim的源代碼 - grep代碼爲all_cflagsall_lflags

4

用於編譯器開關

http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html

 
__OPTIMIZE__ 
__OPTIMIZE_SIZE__ 
__NO_INLINE__ 

__OPTIMIZE__在所有優化編譯定義只有一些宏。如果編譯器正在優化大小而不是速度,則定義__OPTIMIZE_SIZE____NO_INLINE__被定義,如果沒有函數將被內聯到他們的調用者(當沒有優化時,或者內聯已被-fno-inline特別禁用時)。

如果你需要一個完整的編譯字符串,您應該修改您的構建/製作腳本保存在字符串中的特殊.h文件作爲常量或定義。

0

在我的一個項目中,每個構建都進入了自己的目錄,通常整個構建都有一個特定的名稱,如「parallel-debug」或「singlethread-O2」。通常,該目錄中的一個日誌文件將它的位置隱含給我們所有的信息。

無論如何,你可以做的是將$(CC)或$(FLAGS)或任何變量回顯到文本文件中,然後讓程序在啓動時讀取該文件。它不是元魔法,Scott Meyers可能沒有采訪你,因爲它有效的C++ VII,但是這個問題似乎並不值得那麼多頭疼。

2

另一種解決方案是簡單地將gcc編譯器調用與一個將標誌保存到頭文件的shell腳本包裝起來。然後,您可以在源文件中的頭文件,例如:

#!/bin/sh 

echo "#define GCC_OPTIONS \"$*\"" > gcc_options.h 
exec gcc [email protected] 

調用該腳本gcc_wrap -O0 main.c將產生頭文件包含以下內容,然後用main.c中的編制進行

#define GCC_OPTIONS "-O0 main.c"