【Linux】C++程式開發與除錯
阿新 • • 發佈:2018-12-06
gcc的基本用法
g++ 與 gcc的關係:
Linux的gcc和g++的區別
用gcc編譯C++檔案
anyway,還是用g++吧
#include <iostream>
int main(int args, char** argv){
std::cout<<"Hello, world"<<std::endl;
return 0;
}
1. 預處理
g++ -E hello.cc -o hello.iig++ -E hello.cc -o hello.ii
包括去掉開頭程式、巨集替換、去掉註釋
-E 表示預處理完就結束
原始碼共五行
預處理完
2. 編譯
g++ -S hello.ii
-S 表示停到編譯結束。將預處理過程生成的.i字尾的檔案轉化成彙編檔案,裡面儲存的是相應的彙編程式碼,這個過程叫做編譯。
會生成hello.s
3. 彙編
g++ -c hello.s -o hello.o
將彙編檔案中的彙編程式碼翻譯成相應的機器語言,這個過程叫做彙編。.o是GCC生成的目標檔案,除非你是做編譯器和聯結器除錯開發的,否則開啟這種.o沒有任何意義。二進位制機器碼一般人也讀不了。
4. 連結
g++ hello.o -o hello
完成連結這個過程,它通過連結器ld將執行程式的目標檔案和庫檔案連結在一起,生成最後的可執行檔案
將上面的過程一氣呵成,可以用
g++ hello.cc -o hello
常用屬性
-o:指定輸出檔案的名稱
-g:新增gdb除錯選項
-Wall:開啟編譯器幾乎所有常用的警告──強烈建議你始終使用該選項。
-c 生成目標檔案不連結
- 使用C++ 11
g++ -std=c++11 ***
gdb
啟動gdb
gdb <program>
program也就是你的執行檔案,一般在當前目錄下。
- l:檢視原始碼
- b:設定斷點,包括行號,函式等
- r:執行程式
- c:繼續
- bt:檢視堆疊
- n:單步跟蹤,但是不進入函式
- s:單步跟蹤,進入函式
- until:跳出迴圈
- until+行號:到某行
- finish:執行直到當前函式返回
- q:退出gdb