Linux 下動態庫和靜態庫的建立和調用

來源:互聯網
上載者:User
每個程式實質上都會連結到一個或者多個的庫。比如使用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)非位置依賴性代碼。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.