簡體   English   中英

gcc 使用警告/優化標志鏈接目標文件

[英]gcc linking object files with warning/optimization flags

我們正在使用泛型編譯一個軟件,其中文件首先被制作成目標文件,它們的構建方式如下:

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 ,它會做什么嗎?

編輯:根據反饋澄清含義。

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

當然,您不需要將它們包含在鏈接階段。 你已經知道了,因為你包括它們。 但我認為你真正想知道的是......

如果在從目標文件構建 flex 二進制文件時包含 -Wall、-Wextra 和 -O2,它會做任何事情嗎?

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

優化是不同的。 有些優化可以在鏈接時執行,但可能無法在默認優化級別執行。 省略鏈接命令中的優化標志不應破壞您的構建,但包含它們可能會導致二進制文件更快和/或更小。

總的來說,我認為沒有充分的理由避免在鏈接步驟中傳遞與編譯步驟中相同的警告和優化標志。 如果您願意,傳遞特定於預處理器的標志(例如-D )也無害,因為它們只會在鏈接期間被忽略。 我認為所有這些都是由make管理的,因此您實際上並不需要每次都輸入選項。

否 您只是通過對 gcc 的最終調用來調用鏈接器,並且 -W 和 -O 標志用於編譯器。

-Wall 主要是一個預處理器選項,但也有庫的參考。 這里

-Wextra 似乎嚴格來說是一個 C++ 預處理器選項。 這里

-O2 是編譯器優化級別設置。 這里

因此,要回答您的確切問題,只有 -Wall 可能會在您的鏈接步驟中有所幫助。 另外兩個不會。 您可以通過使用和不使用這些選項進行構建來測試這一點,看看是否在出現警告的情況下創建了任何額外的輸出,以及構建之間的代碼大小或執行時間是否不同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM