編譯程序-GCC

1、流程圖

clipboard.png

2、編譯流程

1. 預處理階段(Pre-Processing)

功能:插入源文件包含的頭文件代碼和替換源文件中的宏定義代碼
  • 命令c++

    gcc -E hello.c -o hello.i
  • 源文件
    clipboard.png
  • 預處理代碼
    clipboard.png

2. 編譯階段(Compiling)

功能:將預處理代碼轉換爲彙編代碼
  • 命令函數

    gcc -S hello.i -o hello.s
  • 彙編文件
    clipboard.png

3. 彙編階段(Assembling)

功能:將彙編代碼轉換爲機器代碼
  • 命令spa

    gcc -c hello.s -o hello.o
  • 目標文件
    clipboard.png

4. 連接階段(Linking)

功能:將各個目標件連接爲可執行程序
  • 命令.net

    gcc hello.o -o hello
  • 可執行文件
    clipboard.png

3、應用場景

clipboard.png

1. 編譯單文件可執行程序

  • 文件結構調試

    • 源文件 hello.c
    • 目標文件 hello
  • 命令c++11

    # 最簡單的可執行文件
    gcc hello.c -o hello
    
    # 帶調試信息和編譯警告的可執行文件
    gcc -g -Wall hello.c -o hello

2. 編譯多文件可執行程序

  • 文件結構code

    • 源文件 main.c math.c
    • 目標文件 main
  • 命令blog

    # 直接指定源文件與目標文件
    gcc main.c math.c -o main

3. 編譯靜態庫

  • 文件結構ip

    • 頭文件 math.h
    • 源文件 math.c
    • 目標文件 libmath.a
  • 命令內存

    # 第一步:生成目標文件
    gcc -c math.c -o math.o
    
    # 第二步:建立靜態庫
    ar crv libmath.a math.o
  • 查看靜態庫
    clipboard.png

    # 查看 math.o 函數列表
    nm math.o
    
    # 查看 libmath.a 函數列表
    nm libmath.a

4. 編譯動態庫

  • 文件結構

    • 頭文件 math.h
    • 源文件 math.c
    • 目標文件 math.so
  • 命令

    # -fPIC 
    gcc math.c -fPIC -shared -o math.so
  • 說明

    • -fPIC:做用於編譯階段,告訴編譯器產生與位置無關代碼,所有使用相對地址。代碼能夠被加載器加載到內存的任意位置,均可以正確的執行。
    • –shared:指明編譯成動態庫

5. 編譯使用靜態庫的可執行程序

  • 文件結構

    • 源文件 main.c libmath.a
    • 目標文件 main
  • 命令

    # 需指定靜態庫目錄和靜態庫名稱
    gcc main.c -L. -lmath -o main
  • 說明

    • -L:指定靜態庫尋找路徑(.表示當前目錄)
    • -l:指定靜態庫名稱(libmath.a對應庫名引用爲math)
    • 路徑和文件後必須緊跟參數,不能有空格。

6. 編譯使用動態庫的可執行程序

  • 文件結構

    • 源文件 main.c math.so
    • 目標文件 main
  • 命令

    # math.so 與 main.c 位於同一目錄
    gcc main.c -Wl,-rpath='.' math.so -o main
  • 說明

    • -Wl 表示編譯器將後面的參數傳遞給連接器 ld
    • 經過 -Wl,-rpath='' 指定動態庫搜索路徑,.表示當前目錄
    • 默認搜索目錄爲 lib 和 /usr/lib
    • 採用 rpath='.' 則優先在同級目錄搜素,而後再到系統目錄搜索。

7. 編譯使用靜態庫和動態庫的可執行程序

8. 編譯使用多個靜態庫和動態庫的可執行程序

9. 編譯使用pkgconfig的c++11可執行程序

4、編譯選項

  • 添加加調試信息

    gcc -g xxx.c
  • 使用c++11標準編譯

    g++ -std=c++11

5、參考資料

*Linux環境下多版本編譯器(gcc)共存

相關文章
相關標籤/搜索