每個程式實質上都會連結到一個或者多個的庫。比如使用C函數的程式會連結到C執行階段程式庫,GUI程式會連結到視窗庫等等。無論哪種情況,你都會要決定是連結到靜態庫(static libary)還是動態庫(dynamic libary)。
連結到靜態庫會使你的程式臃腫,並且難以升級,但是可能會比較容易部署。
而連結到動態庫會使你的程式輕便,並且易於升級,但是會難以部署
最近寫的.c檔案比較大,先在決定產生一個linux下面的庫,來調用我們編譯好的函數,這樣子的話我們的主函數就顯得比較簡潔不是很擁擠,好了下面是樣本執行個體。
檔案目錄:
/mnt/windows/linuxso/
檔案目錄下面的檔案:
test1().c test2.c main.c
檔案test1().c內容:
#include<stdio.h>
#include<stdlib.h>
void hello()
{
printf("hello ,xmphoenix\n");
}
void linuxso()
{
printf("i can use the linux so\n");
}
void parso(int a)
{
int c;
int b=7;
c=b+a;
printf("i get the sum is %d\n",c);
}
檔案test2().c內容:
#include<stdio.h>
#include<stdlib.h>
void xmphoenix(int a)
{
if(a==9)
{
printf("I come frome hubei\n");
}
else
printf("i cannot receive your command\n");
}
檔案main.c內容:
#include<stdio.h>
#include<stdlib.h>
int main(int argc,char *argv[])
{
hello();
linuxso();
parso(9);
xmphoenix(9);
return 0;
}
下面是具體的編譯流程:
靜態庫:
靜態庫也就相當於是把一系列的object檔案放在同一個檔案中(類似windows中的.lib檔案)。當你提供一個靜態庫給連結器時,連接器將會搜尋靜態庫,從中找到他所需要的object檔案,提取出他們,將他們連結到你的程式中,就像你直接提供那些檔案一樣。
cr標誌告訴ar將object檔案封裝(archive),我們可以使用nm -s 命令來查看.a檔案的內容;
-L指定了lib的搜尋路徑,-l指定了連結的庫的名字-ltest也就是連結libtest.a
動態庫編譯和調用:
動 態庫(static lib)也可一也可以成為共用庫(shared lib),一般的尾碼名是.so。動態庫與靜態庫有點類似,他們都是一系列的object檔案的集合,只是他們的組織方式不同。同樣他們的連結方式也是不 同的,動態庫只在執行是連結使用,並不把相應的部分編譯入程式中,在使用是一個庫可以被多個程式使用故可稱為共用庫,而靜態庫將會整合到程式中,連結時各 程式使用自己的庫。
-fPIC告訴gcc將原始碼編譯成共用的object檔案,PIC(Position-Independent Code)非位置依賴性代碼。