1. 程式人生 > >【Linux】C++程式開發與除錯

【Linux】C++程式開發與除錯

gcc的基本用法

g++ 與 gcc的關係:
Linux的gcc和g++的區別
用gcc編譯C++檔案
anyway,還是用g++吧

假設有一個原始檔為main.cc

#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 除錯利器

啟動gdb

gdb <program>

program也就是你的執行檔案,一般在當前目錄下。

  • l:檢視原始碼
  • b:設定斷點,包括行號,函式等
  • r:執行程式
  • c:繼續
  • bt:檢視堆疊
  • n:單步跟蹤,但是不進入函式
  • s:單步跟蹤,進入函式
  • until:跳出迴圈
  • until+行號:到某行
  • finish:執行直到當前函式返回
  • q:退出gdb