(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製...