GCC執行過程 gcc編譯靜態庫和動態庫

2021-09-27 10:39:00 字數 2054 閱讀 4135

(1)預處理階段

這個階段主要是處理原始檔中的#ifdef、#include和#define命令

命令:gcc -e ***.c -o ***.i

(2)編譯階段

輸入的是中間檔案*.i,編譯後生成組合語言檔案*.s

命令:gcc -s ***.i -o ***.s

(3) 彙編階段

輸入的是彙編檔案*.s,輸出的轉換生成的機器語言*.o

命令:gcc -c ***.s -o ***.o

(4) 連線階段

將輸入的機器**檔案*.s,匯集成乙個可執行的二進位制檔案

命令:gcc ***.o -o ***

(1)建立靜態庫

例如原始碼檔案為:lib.c,內容如下:

int add(int a, int b)

int sub(int a, int b)

要將其編譯成為靜態庫檔案——lib.a,則可使用如下的命令:

gcc -c lib.c       生成 lib.o 檔案

ar rcs lib.a lib.o  // 生成 lib.a 檔案

(2)使用靜態庫

靜態庫建立成功後,需要鏈結到應用程式中使用。應用程式可以引用該庫中的函式或者全域性變數。為了使應用程式可以正確引用該庫中的全域性符號,需要製作乙個包含該靜態庫中全域性符號宣告的檔案。這個標頭檔案可以包含在應用程式的標頭檔案中,這樣就可以引用靜態庫中的全域性符號了。包含靜態庫檔案的標頭檔案:static_lib.h,內容如下:

extern int add(int a, int b);

extern int sub(int a, int b);

應用程式:main.c

#include #include "static_lib.h"

int main()

鏈結靜態庫,並生成可執行檔案

命令:gcc main.c -static ./static_lib.a -o ***   // *** 為可執行檔案

動態庫又稱為共享庫或者動態鏈結庫,現代程式中大量地使用動態鏈結庫。例如,windows 環境中的dll檔案和linux環境下的 so檔案。動態庫是在程式啟動時被裝載的。當乙個程式裝載了乙個動態庫後,其他應用程式仍然可以裝載同乙個動態庫。

例如動態庫的.c檔案為:share_lib.c

void sort(int *array, int length)

else

break;

}array[j] = temp;

}}

gcc建立乙個動態庫。由於動態庫可以被多個程序共享載入,所以需要生成位置無關的目標檔案。這時需要使用gcc編譯器的-fpic選項,該選項用於生成位置無關的**。需要使用-fpic選項和-shared 選項,該選項將位置無關的**製作為動態庫。

建立靜態庫命令:gcc -shared -fpic -o share_lib.so share_lib.c    // 生成庫為 share_lib.so

使用動態庫

動態庫建立完後,應用程式可以引用該庫中的函式或全域性變數。為了使應用程式可以正確引用該庫中的全域性符號,需要製作乙個包含該動態庫中全域性符號宣告的標頭檔案。標頭檔案:share_lib.h

extern void sort(int *array, int length);
應用程式:main.c

#include #include "share_lib.h"

int main()

;

sort(array, 5);

int i;

printf("the array:");

for(i = 0; i < 5; i++)

printf(" %d ", array[i]);

printf("\n");

return 0;

}

使用靜態庫命令:gcc main.c ./share_lib.so -o main    // 生成可執行檔案 main

GCC編譯過程和動態靜態庫

outline toc 本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll linux上對應的是.a so 編譯過程 之所以成為 靜態庫 是因為在鏈結階段,會將彙編生成的目標檔案.o與...

gcc編譯靜態庫 動態庫

今天,乙個同事編譯靜態庫,我也趁此機會在溫習一下,先google一下,然後在自己實驗。首先,在網上抄個例子,內容如下 建靜態庫 hellos.h ifndef hello s h define hello s h void prints char str endif hellos.c include...

GCC 編譯 靜態庫 動態庫

工作流程 命名格式 lib 庫的名字 so製作 第一步 得到 o檔案 引數 fpic表示生成與位置無關 gcc i.include fpic c c第二步 建立動態庫 shared 製作動態庫 o 重新命名生成的新檔案 gcc shared o lib so o使用 命名格式 lib 庫的名字 a製...