簡體   English   中英

-O0、-O1 和 -g 之間有什么區別

[英]What is the difference between -O0 ,-O1 and -g

我想知道如何使用 -O0、-O1 和 -g 在庫中啟用調試符號。 有些人建議使用 -O0 來啟用調試符號,有些人建議使用 -g。

那么 -g 和 -O0 之間的實際區別是什么,-01 和 -O0 之間的區別是什么,哪個最好使用。

-O0是優化級別 0(不優化,與省略 -O 參數相同)

-O1是優化級別 1。

-g在二進制文件中生成和嵌入調試符號。

請參閱 gcc 文檔和聯機幫助頁以獲取進一步說明。

對於進行實際調試,調試器通常無法理解經過優化編譯的內容,盡管調試符號對於其他事情甚至經過優化也很有用,例如生成堆棧跟蹤。

-OX指定編譯器將執行的優化級別 -g用於生成調試符號。

來自 GCC 手冊

http://gcc.gnu.org/onlinedocs/

3.10 控制優化的選項`

-O

-O1

優化。 優化編譯需要更多的時間,對於大型函數需要更多的內存。 使用 -O,編譯器會嘗試減少代碼大小和執行時間,而不執行任何需要大量編譯時間的優化。`

-O2

進一步優化。 GCC 執行幾乎所有不涉及空間速度權衡的受支持優化。 與 -O 相比,此選項增加了編譯時間和生成代碼的性能。`

-O3

優化更多。 -O3 打開 -O2 指定的所有優化,並打開 -finline-functions、-funswitch-loops、-fpredictive-commoning、-fgcse-after-reload、-ftree-vectorize 和 -fipa-cp-clone 選項。 `

-O0

減少編譯時間並使調試產生預期的結果。 這是默認設置。 `

-G

以操作系統的本機格式(stabs、COFF、XCOFF 或 DWARF 2)生成調試信息。 GDB 可以使用此調試信息。`

-O0不啟用調試符號,它只是禁用生成代碼中的優化,因此調試更容易(匯編代碼或多或少直接遵循 C 代碼)。 -g告訴編譯器生成用於調試的符號。

可以為優化代碼生成符號(只需繼續指定-g ),但嘗試單步執行代碼或設置斷點可能無法按預期工作,因為發出的代碼可能不會“跟隨”原始 C 源代碼。 所以在這種情況下調試會相當棘手。

-O1 (與-O相同)執行最少的優化集。 -O0本質上是告訴編譯器不要優化。 有很多選項可以很好地控制您可能希望編譯器如何執行: http : //gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc/Optimize-Options.html#Optimize-選項

正如其他人所提到的, -O 選項集指示編譯器必須完成的優化級別,而 -g 選項添加調試符號。

更詳細的了解請參考以下鏈接

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize-Options http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html#Debugging-Options

暫無
暫無

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

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