linux GCC編譯過程以及靜態庫動態庫編譯

2021-09-28 15:50:29 字數 1948 閱讀 3230

一、gcc編譯指令各項引數

四個步驟

預處理 -e gcc -o test.i -e test.c

彙編 -s gcc -o test.s -s test.c

機器碼 -c gcc -o test.o -c test.c

鏈結 依賴的檔案 gcc -o test test.o

-o 生成目標

-g 除錯

1.常用引數

-l 指定庫檔案所在的目錄

靜態庫 .a 鏈結時被編譯到可執行程式中,執行時在可執行檔案中找函式

動態庫 .so 鏈結時只是指定了要呼叫的庫,執行時到/lib 裡去找函式庫

庫檔名 字首+庫名+字尾

lib .a .so

libm.a 是math.h libm.a是庫檔名 m是庫名

庫名

-l 指定庫名

gcc -o test test.c mplay.c -l/usr/lib -lpthread

pthread是庫名 庫檔名在/usr/lib目錄中,-l可省略 -l必須存在

-static 代表強制使用靜態

-shared 動態

-i 用來指定標頭檔案所在的目錄

gcc -o test -i./lib -include mplay.h test.c ./lib/mplay.c -lpthread

gcc -o test -i./lib test.c ./lib/mplay.c -lpthread
-include 用來指定引入標頭檔案

gcc -o test -include mplay.h test.c mplay.c -lpthread

-l 和-l是鏈結時使用

-i 和-include 機器碼時使用

2.其它引數

-shared 生成共享目標檔案。通常用在建立共享庫時。

-static 禁止使用共享連線。

-w 不生成任何警告資訊。

-wall 生成所有警告資訊。

-o0 不進行優化處理。

-o 或 -o1 優化生成**。

-o2 進一步優化。

-o3 比 -o2 更進一步優化,包括 inline 函式。

-g 生成除錯資訊。gnu 偵錯程式可利用該資訊。

-ansi 只支援 ansi 標準的 c 語法。

-pipe 使用管道

3.靜態庫編譯

兩個步驟

1)生成機器碼 -c

2)用ar編譯靜態庫

gcc -o mplay.o -c mplay.c

ar -rc libmplay.a mplay.o

庫的使用

gcc -o test -i./lib test.c -l./lib -lmplay -lpthread

-lm 指標libm.a 裡面是函式的定義

math.h 是libm.a內函式的擴充套件宣告

4.動態庫編譯

1)生成機器碼 -c

2)用gcc編譯靜態庫 -shared -fpic

gcc -o mplay.o -c mplay.c

gcc -shared -fpic -o libmplay.so mplay.o

庫的使用

gcc -o test -i./lib -include mplay.h test.c -l./lib -lmplay -lpthread

將libmplay.so拷貝到/lib中然後執行程式

強制指定使用靜態庫編譯程式

gcc -o test -i./lib -include mplay.h test.c -l./lib -lmplay -lpthread -static

5.c++呼叫標準c的函式

extern 「c」

Linux gcc編譯過程及Makefile檔案

選項 含義 o 指定輸出檔名稱 e只預處理 s只編譯 c編譯和彙編,但是不鏈結 巨集的替換,處理預處理指令,刪除注釋,include的檔案加入到該檔案,新增行號和檔案的標識 gcc e main.c o main.i檔案一下變大很多,檢視內容是stdio.h的函式定義等內容 由高階語言,生成彙編 g...

linux gcc編譯引數

gcc 編譯 hello.c hello.i 預處理階段,生成中間檔案 hello.s 彙編階段,生成彙編檔案 hello.o 編譯階段,生成二進位制 檔案 hello 鏈結階段,生成可執行程式 預處理階段,主要是將巨集定義替換,條件編譯 標頭檔案包含,可以cat hello.i檔案檢視 gcc e...

linux gcc編譯選項

1 安全編譯選項 作業系統提供了許多安全機制來嘗試降低或阻止緩衝區溢位攻擊帶來的安全風險,包括dep aslr等。在使用gcc進行編譯時,可以使用gcc的編譯選項來避免堆疊溢位 整數溢位等問題。2 checksec.sh 3 aslr 位址隨機化 aslr address space layout ...