2014-09-21 102 views
2

我爲我的C++項目使用自定義make文件。我正在尋找發佈版本最推薦的編譯標誌。我目前使用下列內容:推薦的GCC版本構建標誌

CXXFLAGS + = -O3 -Wall -DNDEBUG

我以爲上面的是足夠了,但後來我試圖運行的二進制「脫光」的工具,它縮小了尺寸相當一點點。看起來二進制文件中仍然有一些非必要的東西。

我知道這是一個廣泛的主題,但我正在尋找優化(速度和大小)發佈版本的常見設置。我知道默認情況下,gcc甚至不會丟棄死代碼 - 我想知道如何儘快做到這一點。

僅供參考我的化妝設置是https://github.com/YasserAsmi/buildmk

+0

啊 - 令人討厭的用戶再次低調地勸阻人們在需要幫助時提出問題... – YasserAsmi 2014-09-21 21:26:53

+0

是的,在沒有留下任何有用評論的情況下非常受歡迎,這在我看來是毫無意義的。在這個問題上我沒有看到任何錯誤。 – 2014-09-21 21:30:51

回答

2

是的,鏈接後剝離將刪除從C++庫包含的全局符號,例如。您可以使用-s選項獲取g++。它確實可以在客戶現場調試應用程序(例如告訴客戶運行gdb myprog,然後在崩潰時執行bt不會給你任何符號 - >很難找出代碼的位置,除非你有與符號相同的二進制文件[或者可以再現一個],你可以找到那個符號[或者你可以重現這個問題,但是這是很多時候的一廂情願的想法])。

如果你想要小代碼,你也可以使用-Os而不是-O3--這將使編譯器生成優化的代碼,但不會進行使代碼更大的優化(所以只有內聯小函數,不展開循環等)。在某些情況下,小代碼實際上運行速度比「更高優化」級別更快,但代碼更大,因爲在許多地方調用的中型函數被保留爲緩存中的單個函數,而不是內聯和膨脹應用。

不幸的是,很難肯定地說出任何特定選項對可執行文件的大小有什麼影響 - 在某些情況下,內聯使得代碼更小,其他情況下使代碼更長。展開計數爲2的循環使得代碼比在循環中做同樣的事情更短的代碼等。如果你想快速和小代碼,你將不得不擺弄setitngs,看看哪些對你有什麼影響碼。確保你跟蹤你從每個選項中得到的效果。有很多不同的優化選項,列出here(這是4.9.1,你也可以在gcc站點上找到舊版手冊的在線版本)。

+0

謝謝!很有幫助。我沒有意識到符號表是被剝奪的東西。這就說得通了。另外-Os是我沒有嘗試過的東西。 – YasserAsmi 2014-09-21 21:33:57

+0

那麼,'-s'或多或少會和'strip'一樣,所以不要指望它「做魔術」。但是這比第一次運行編譯器要少一步,然後在生成的二進制文件上運行'strip'。另一方面,'strip'確實有一堆控件,可以讓你精確地調整你刪除的內容(如果你只是運行'strip'而沒有任何選項,它將刪除「所有內容」) - 你也可以使用'strip '例如從文件中刪除部分 - 但只有在你真的知道你在做什麼時才這樣做。 – 2014-09-21 21:39:26

+0

對不起,我的意思是-Os(是我編輯的錯字)。有意義的是 - s與strip相同。我實際上並沒有打算使用脫衣舞(我不想讓我的生活更難:)) – YasserAsmi 2014-09-21 21:43:10

1
CXXFLAGS += -O3 -Wall -DNDEBUG 

是罰款。假設使用NDEBUG,我從來沒有親自使用過。 如果你需要一個較小的二進制文件,使用「-s」條符號表,它與條的類似。一般來說,我不打擾並留下符號表,因爲它仍然有用。