2017-05-10 57 views
0

我使用GCC編譯了包含在CFLAGS中的-O3 -fast-math的一些C代碼。我很困惑在鏈接時是否也將這些標誌傳遞給GCC,即將-Wl,-O3 -Wl,-fast-math放置在LDLIBS中。給予GCC連接器的優化標誌的效果

確切地說-Wl,<...>是做什麼的,爲什麼我們需要在CFLAGSLDLIBS中通過相同的選項?

此外,有沒有任何特定於平臺的鏈接器相對於這些標誌進入鏈接器的行爲?

回答

1

選項-Wl,...指導GCC傳遞...直經爲 鏈接,ld,如果調用鏈接。

編譯器優化選項-O0, -O1等不被鏈接器 識別,如果通過則忽略。編譯器優化選項 -ffast-math與不相關的ld選項-f<so_name>, 發生衝突,鏈接器僅接受-shared。因此 如果-shared不通過,一個ld使用錯誤的結果:

/usr/bin/ld: -f may not be used without -shared 

並且如果-shared通過,則fast-math將被誤解 作爲<so_name>。如果傳遞給ld,則 表-f...的任何其他編譯器選項也適用。

這裏是the GCC commandline options reference 這裏是一個 GNU ld

如果用GNU建設作出,本作變量LDLIBS是連接選項(-l...)常規 保留。其他鏈接選項 在LDFLAGS通常通過查看來自binutils的(包括BFD和黃金)this answer

+1

鏈接器不認識'-O'選擇,他們確實有一定的效果,但一個相當小的一個。 –