2017-03-03 79 views
1

我們正在編制使用其中的文件,首先製作成目標文件泛型的軟件,它們是建立像這樣:GCC連接帶有警告/優化標誌的目標文件

arm-unknown-linux-gnu-gcc -c -O2 -Wstrict-prototypes -Wdeclaration-after-statement -fsigned-char -I/opt/tm-sdk/include -mlittle-endian -Wno-trigraphs -fno-strict-aliasing -fno-omit-frame-pointer -march=armv4 -mtune=arm9tdmi -Wall -Wextra -o src/flex.o src/flex.c 
... 
arm-unknown-linux-gnu-gcc -c -O2 -Wstrict-prototypes -Wdeclaration-after-statement -fsigned-char -I/opt/tm-sdk/include -mlittle-endian -Wno-trigraphs -fno-strict-aliasing -fno-omit-frame-pointer -march=armv4 -mtune=arm9tdmi -Wall -Wextra -o src/flexdb.o src/flexdb.c 

然後,他們用鏈接:

arm-unknown-linux-gnu-gcc -o flex src/flex.o src/flexdb.o src/flexio.o src/flexprotocol.o src/flexsettings.o src/flexstate.o -L/opt/tm-sdk/lib -ltag -lrt -ltmreader -lsqlite3 -lsha1 

我的問題是: 我們是否需要在鏈接期間包含優化和警告標誌?如果從對象文件創建flex二進制文件時包含-Wall,-Wextra和-O2,它會執行任何操作嗎?

謝謝

編輯:根據反饋澄清意思。

+0

C中的泛型是編譯時表達式。不知道爲什麼這是相關的。哪個「編譯的最後階段」?編譯器運行在一個單一的過程(從用戶視圖) – Olaf

+0

我只是看到這是一個兩步過程。構建目標文件然後組合目標文件。 –

+0

Build!=編譯! – Olaf

回答

4

我們是否需要在編譯的最後階段包含優化和警告標誌?

當然,你不需要需要包括他們的鏈接階段。你已經知道,因爲你不包括包括他們。但我認爲你真正想知道的是...

如果在從目標文件構建flex二進制文件時包含-Wall,-Wextra和-O2,它會執行任何操作嗎?

在編譯階段會生成所有或幾乎所有警告。我不親自知道任何例外情況,但可以想象有一些例外情況。因此,在鏈接過程中傳遞與警告相關的標誌可能會觸發警告,否則您不會收到警告。但是這不應該以任何方式影響編譯的二進制文件。

優化是不同的。可以在鏈接時執行優化,但可能不會在默認優化級別執行。從鏈接命令中省略優化標記不應該破壞構建,但將它們包括在內可能會導致更快和/或更小的二進制文件。

總的來說,我沒有理由避免在編譯步驟中的鏈接步驟中傳遞相同的警告和優化標誌。如果您願意,也可以通過預處理程序特定的標誌(例如-D),因爲在鏈接期間它們將被忽略。我認爲所有這些都是由make來管理的,所以並不是每次都需要輸入選項。

+0

正確,我們正在使用make。謝謝。 –

0

NO您只需調用鏈接器,最後調用gcc和-W,-O標誌用於編譯器。

+0

這對於例如LTO。 – Olaf

-4

- 牆主要是一個預處理器選項,但也有一個庫的參考。請參閱here

-Wextra似乎嚴格是C++預處理器選項。請參閱here

-O2是編譯器優化級別設置。請參閱here

因此,要回答您的確切問題,只有-Wall可能會在您的鏈接步驟中提供幫助。其他兩個不會。您可以通過在沒有這些選項的情況下構建來測試它,看看是否在警告情況下創建了任何附加輸出,以及構建之間的代碼大小或執行時間是否有所不同。

+2

既不是-Wall也不是-Wextra是預處理器選項。 – DyZ

+0

我認爲-Wextra只有一些C++特性。我不相信它只是C++。 C++ only options can see [這裏](https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html) –

+0

在幫助頁面上,除了一個外,其他都與C++有關。指針與整數零與<, <=, >或> =進行比較。 (僅限C++)枚舉器和非枚舉器都出現在條件表達式中。 (僅限C++)不明確的虛擬基礎。 (僅限C++)爲已聲明爲register的數組下標。 (僅限C++)取得已聲明寄存器的變量的地址。 (僅限C++)基類不在派生類的拷貝構造函數中初始化。 – netskink