天天看點

GCC/G++編譯流程與編譯選項程式的編譯流程和編譯選項

程式的編譯流程和編譯選項

程式的編譯流程

  1. 預處理,生成預編譯檔案
    gcc –E hello.c –o hello.i
               
  2. 編譯,生成彙編代碼
    gcc –S hello.i –o hello.s
               
  3. 彙編,生成目标檔案
    gcc –c hello.s –o hello.o
               
  4. 連結,生成可執行檔案

常見編譯選項

-l(這是小寫的L):指定要連結的庫。庫檔案的一般命名方式為libpthread.so, 去掉字首lib和字尾**.so**即是我們要連結的庫的名字,例如

gcc hello.c -lpthread -o hello

。要連結成功,前提是庫檔案是在預設搜尋路徑

/usr/lib/

/usr/local/lib/

下面。如果不在預設搜尋路徑下面,就需要其他參數的加持了。

-L:指定庫的搜尋路徑。如果庫檔案不在預設的庫目錄下面,即

/usr/lib/

/usr/local/lib/

,那麼就需要使用這個參數去指定連結目錄。例如,有一個名叫math的庫在

/home/xxx/test/

目錄下,我們的程式編譯時需要用到這個庫,那麼用法如下:

gcc hello.c -L/home/xxx/test -lmath -o hello.exe

-I(這是大寫的i): 指定頭檔案所在目錄。如果不加這個參數,編譯器将會在預設的頭檔案目錄,即

/usr/include

/usr/local/include

中去搜尋頭檔案。如果制定了-I參數,例如

gcc hello.c -I/home/xxx/test -o hello.exe

,那麼編譯器将會首先在指定的目錄中去搜尋頭檔案,如果搜尋不到,再去預設的路徑下搜尋,再搜不到則抛出編譯錯誤。

-include: 用于指定單個頭檔案的路徑。一般都是在源碼裡通過

#include "xxx.h"

來指定的,是以用的不多。這裡提一下

#include "xxx.h"

#include <xxx.h>

的差別。前者會優先搜尋目前目錄下的xxx.h檔案,然後再去預設的頭檔案目錄下搜尋。後者則是直接去預設目錄搜尋。

-static :此選項将禁止使用動态庫,是以,編譯出來的可執行檔案,一般都很大。不需要其他什麼運作環境就可以直接運作。

-share :此選項将盡量使用動态庫,是以生成檔案比較小,但是需要運作該代碼的機器包含有程式需要的動态連結庫。

-O0,-O1,-O2,-O3:編譯器的優化選項的 4 個級别,-O0 表示沒有優化, -O1 為預設值,-O3 優化級别最高。

-std=c++20:僅g++可用,用于指定C++版本資訊。

-std=c99:指定c語言版本。

-Wall 顯示所有警告。

繼續閱讀