程式的編譯流程和編譯選項
程式的編譯流程
- 預處理,生成預編譯檔案
gcc –E hello.c –o hello.i
- 編譯,生成彙編代碼
gcc –S hello.i –o hello.s
- 彙編,生成目标檔案
gcc –c hello.s –o hello.o
- 連結,生成可執行檔案
常見編譯選項
-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 顯示所有警告。