可以從程序內部訪問編譯了c/C++程序的gcc編譯器開關嗎?從內部C/C++程序訪問GCC編譯器開關
在我的應用程序中,作爲日誌信息的一部分,我想編寫程序編譯時使用的哪些開關,例如編譯器的優化和預處理器變量輸入。
可以從程序內部訪問編譯了c/C++程序的gcc編譯器開關嗎?從內部C/C++程序訪問GCC編譯器開關
在我的應用程序中,作爲日誌信息的一部分,我想編寫程序編譯時使用的哪些開關,例如編譯器的優化和預處理器變量輸入。
不以任何標準方式。
它通常是構建系統,它將在構建到應用程序中的版本字符串中生成這樣的內容(但它們都不是自動的)。
作爲Martin答案的補充:作爲這種技術的一個例子,您可以看看Vim的源代碼 - grep代碼爲all_cflags
或all_lflags
。
用於編譯器開關
http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html
__OPTIMIZE__ __OPTIMIZE_SIZE__ __NO_INLINE__
__OPTIMIZE__
在所有優化編譯定義只有一些宏。如果編譯器正在優化大小而不是速度,則定義__OPTIMIZE_SIZE__
。__NO_INLINE__
被定義,如果沒有函數將被內聯到他們的調用者(當沒有優化時,或者內聯已被-fno-inline特別禁用時)。
如果你需要一個完整的編譯字符串,您應該修改您的構建/製作腳本保存在字符串中的特殊.h
文件作爲常量或定義。
在我的一個項目中,每個構建都進入了自己的目錄,通常整個構建都有一個特定的名稱,如「parallel-debug」或「singlethread-O2」。通常,該目錄中的一個日誌文件將它的位置隱含給我們所有的信息。
無論如何,你可以做的是將$(CC)或$(FLAGS)或任何變量回顯到文本文件中,然後讓程序在啓動時讀取該文件。它不是元魔法,Scott Meyers可能沒有采訪你,因爲它有效的C++ VII,但是這個問題似乎並不值得那麼多頭疼。
另一種解決方案是簡單地將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"