推薦
mingw
環境下的
gcc,和
linux
下的gcc
一致性較好。在
www.mingw.
org(或
g++編譯器
安裝後再命令列執行
gcc命令,如果顯示
gcc:no input files
則按照成功,如果沒有,則設定環境變數加入
bin目錄
若已經安裝了
devcpp
,可能已經含有
mingw
(
d:\program files (x86)\dev-cpp\mingw64
)
測試test.cpp
#include
main()//
沒有int
//沒有返回值
在命令列
gcc test.cpp
,程式沒有輸出,目錄下多出可執行檔案
a.exe
gcc test.cpp -o test
(可執行檔名為
test
)編譯後可以用
test
(linux
為./test
)執行程式
讓編譯顯示警告:
gcc test.cpp -o test -wall
編譯器警告了這三個問題
test.cpp: in function 'int main()':
test.cpp:7:19: warning: format '%d' expects a matching 'int' argument [-wformat=]
printf("%d%d\n",c);
進一步用
-ansi-pedantic
檢擦**是否符合
ansi c標準(
只能檢查
.c檔案,無法檢查
.cpp檔案)
gcc test.c -o test -wall -ansi -pedantic
test.c: in function 'main':
test.c:6:2: warning: iso c90 forbids mixed declarations and code [-wpedantic]
int c=a+b;//c
沒有在開頭定義
^ test.c:6:6: warning: unused variable 'c' [-wunused-variable]
int c=a+b; ^
-lm能讓編譯器連線數學庫允許使用
math.h
中函式,
c++會自動連線(副檔名
.cpp)
-ddebug
在編譯時定義符號
debug
,也可以換成其他的(如
local
)這樣#ifdef debug
到#endif
中間的語句會被編譯,否則其中不會被編譯
-o1 -o2
和-o3
可對**進行速度優化
gdb要和
gcc配合使用
編譯時加
-g生成除錯用的符號表(
gcc test.cpp -o test -wall -g)
編譯成exe
後,執行
gdb test.exe
顯示:reading symbols from test.exe...done.
從test. exe
中讀取符號 使用
l命令能看到源程式(l不是
1)l 15
,會顯示第
15行以及前後若干行。
l main
顯示main
函式開頭的附近15行
l顯示下10
行,list -
顯示上10行。
所有命令可以用
help list
檢視(gdb
中的命令可以用前幾個字母簡寫,
list寫成l
) 執行程式的命令是r(
run),設定斷點b(
break),c
(continue
)繼續執行,n(
next)和s
(step
)逐條執行(
next
把函式當作一行
,step
進入函式內部),
enter
b main
在main
的開頭設定斷點,也用行號設定斷點。
可以用b main和r
開頭除錯程式 u
(until
)執行到指定位置,p(
)列印變數值,
i lo
(info locals
)顯示所有區域性變數:
u doit
執行到doit
函式的開頭,此時可列印函式值
disp(display)
和n/s/u
等單步執行指令配合使用:
i disp
(info display
)列出所有
display,
刪除/禁止/
恢復display
:d(delete)/ dis(disable)/en(enable) disp (dislay)
類似根據斷點編號刪除/禁止
/恢復斷點,或cl(
clear
)根據行號或函式名刪除
gdb的高階功能:
棧幀相關命令(通過
help stack
檢視): bt
comm
(commands
)指定在某個斷點處停下來後執行
gdb命令, ig
(ignore
)讓斷點在前
count
次不停,
cond(condition)
給斷點加條件
:cond 2(
斷點編號
) i==5(
斷點條件)
watch
特殊斷點:
watch a
(wa a)在a
被修改時停下,並顯示修改前後的變數值,
awatch(aw
)每次被修改都停下
rwatch(rw
)在變數被讀時停下
call
可以像在**中一樣自由排程源程式函式:
call mysort(a,a+10)
如果是stl中函式
(sort)
可能需要在源程式中打包:
void mysort(int*p,int*q)
print,condition,display
也可以這樣使用函式: 如
p rand()
輸出隨機數,
condition
編寫乙個返回
bool
的函式專門作為斷點條件
盡量使用輸出中間變數,直覺,經驗除錯,不用
gdb
編譯器 偵錯程式
linux mac下使用的編譯器是不同的。linux下使用的是gcc編譯器。mac下使用的是clang編譯器。命令格式都是相通的。編譯命令的基本格式 g會在輸出檔案裡可以增加除錯資訊,編譯出的程式在執行過程 現的問題就可以用偵錯程式進行單步除錯。o實際是指令優化的級別。預設 o1是不對指令優化,所以...
GCC編譯器和GDB偵錯程式
gcc gnu compiler collection 是目前linux下最常用的c語言編譯器,它是gnu專案中符合ansi c標準的編譯系統,可以在多種硬體平台上編譯出可執行程式的超級編譯器,執行效率與一般的編譯器相比平均效率要高20 30 在終端中輸入下列命令 gcc options filen...
gcc編譯器和gdb偵錯程式
將高階語言 c語言 程式編譯成為機器可識別的指令 編譯過程 預處理 去掉注釋,展開所有 編譯 語義 語法糾錯,將 解釋成為彙編 彙編 將彙編 解釋成為機器指令 連線 鏈結 庫以及所有的目標檔案,生成可執行程式 庫檔案 大佬實現一些常用的功能介面,為了防止每次編譯耗費大量時間,因此將這些介面 進行編譯...