g++編譯總結
一、編譯注意細節
1.使用g++編譯CPP文件如果用gcc編譯C++源文件時,加以下選項:-lstdc++,否則使用了C++操作的文件編譯會出錯。
2.gcc/g++ 在執行編譯時,需要4步
① 預處理,生成.i的文件[使用-E參數]
② 將預處理后的文件不轉換成匯編語言,生成文件.s[使用-S參數]
③ 有匯編變為目標代碼(機器代碼)生成.o的文件[使用-c參數]
④ 連接目標代碼,生成可執行程序[使用-o參數]
二、gdb調試
1.gdb的調試命令列表.
命令 |
解釋 |
簡寫 |
file |
裝入想要調試的可執行文件 |
無 |
list |
列出產生執行文件源代碼的一部分 |
l |
next |
執行一行源代碼但不進入函數內部 |
n |
step |
執行一行源代碼而且進入函數內部 |
s |
run |
執行當前被調試的程序 |
r |
continue |
繼續執行程序 |
c |
quit |
終止GDB |
q |
|
輸出當前制定變量的值 |
p |
break |
在代碼里設置斷點 |
b |
info break |
查看設置斷點的信息 |
ib |
delete |
刪除設置的斷點 |
d |
watch |
監視一個變量的值,一旦值有變化,程序停住。 |
wa |
help |
GDB的幫助命令 |
h |
使用方法:
在編譯程序的時候添加 –g參數,比如:
g++ -g -o hello hello.cpp
在gdb進行調試的使用再輸入命令gdb+可執行文件名,比如:
gdb hello
查看源文件 list 1,回車重復上一次指令
之后就是根據參數列表,按照自己的需求輸入自己的命令。
參考網址:
http://blog.csdn.net/wfdtxz/article/details/7368357
另外,如果用makefile進行編譯的話,要特別注意使用正則表達式,否則編譯出的文件將不能用於調試。
比如makefile1:(運行正常)
而makefile2:
會提示出如下的錯誤:
三、g++編譯選項詳解:
g++編譯選項對應表:
gcc/g++ |
命令的常用選項格式(選項 解釋) |
-o FILE |
指定輸出文件名,在編譯為目標代碼時,這一選項不是必須的。如果FILE沒有指定,缺省文件名是a.out. |
-c |
只編譯生成目標文件,不鏈接 |
-m486 |
針對 486 進行代碼優化。 |
-O0 |
不進行優化處理。 |
-O 或 -O1 |
優化生成代碼。 |
-O2 |
進一步優化。 |
-O3 |
比 -O2 更進一步優化,包括 inline 函數。 |
-w |
關閉所有警告,建議不要使用此項 |
-Wall |
允許發出gcc能提供的所有有用的警告,也可以用-W(warning)來標記指定的警告 |
-werror |
把所有警告轉換為錯誤,以在警告發生時中止編譯過程 |
-MM |
輸出一個make兼容的相關列表 |
-v |
顯示在編譯過程的每一步中用到的命令 |
-E |
只運行 C 預編譯器。 |
-shared |
生成共享目標文件。通常用在建立共享庫時。 |
-static |
鏈接靜態庫,即執行靜態鏈接 |
-lFOO |
鏈接名為libFOO的函數庫 |
-g |
在可執行程序中包含標准調試信息 |
-ggdb |
在可執行程序中包含只有GNU debugger才能使別的達兩條是信息 |
-O |
優化編譯過的代碼 |
-ON |
指定代碼優化的級別為N,o<=N<=3 |
-ansi |
支持ANSI/ISO C的標准語法,取消GNU的語法擴展中與該標准有沖突的部分(但這一選項並不能保證生成ANSI兼容的代碼) 這一選項將禁止 GNU C 的某些特色, 例如 asm 或 typeof 關鍵詞。 |
-pedantic |
允許發出ANSI/ISO C標准所列出的所有警告 |
-errors |
允許發出ANSI/ISO C標准所列出的所有錯誤 |
-traditional |
支持Kernighan & Ritchie C語法(如用舊式語法定義函數);如果不知道這個選項的含義,也沒有關系 |
-IDIRECTORY |
指定額外的頭文件搜索路徑DIRECTORY。 |
-LDIRECTORY |
指定額外的函數庫搜索路徑DIRECTORY。 |
-DFOO=BAR |
在命令行定義預處理宏FOO,其值為BAR |
-IDIRNAME |
將DIRNAME加入到頭文件的搜索目錄列表中 |
-LDIRNAME |
將DIRNAME加入到庫文件的搜索目錄列表中,缺省情況下gcc 只鏈接共享庫 |
-DMACRO |
以字符串“1”定義 MACRO 宏。 |
-DMACRO=DEFN |
以字符串“DEFN”定義 MACRO 宏。 |
-UMACRO |
取消對 MACRO 宏的定義。 |