linux下的靜態庫和動態庫的編譯

2021-09-25 03:46:53 字數 1953 閱讀 5495

**:

每個程式實質上都會鏈結到乙個或者多個的庫。比如使用c函式的程式會鏈結到c執行時庫,gui程式會鏈結到視窗庫等等。無論哪種情況,你都會要決定是鏈結到靜態庫(static libary)還是動態庫(dynamic libary)。

鏈結到靜態庫會使你的程式臃腫,並且難以公升級,但是可能會比較容易部署。

而鏈結到動態庫會使你的程式輕便,並且易於公升級,但是會難以部署。

靜態庫靜態庫也就相當於是把一系列的object檔案放在同乙個檔案中(類似windows中的.lib檔案)。當你提供乙個靜態庫給鏈結器時,聯結器將會搜尋靜態庫,從中找到他所需要的object檔案,提取出他們,將他們鏈結到你的程式中,就像你直接提供那些檔案一樣。

如何建立靜態庫呢?你可以使用ar命令來建立。

下面我們舉個例子:

test/lib/test1.c

#include

int hello_world1()

test/lib/test2.c

#include

void hello_world2()

#include

int main()

現在我們編譯他們進入目錄test/lib

$gcc -c test1.c

$gcc -c test2.c

$lstest1.c  test1.o  test2.c  test2.o

$ar cr libtest.a test1.o test2.o

$lslibtest.a  test1.c  test1.o  test2.c  test2.o

cr標誌告訴ar將object檔案封裝(archive),我們可以使用nm -s 命令來檢視.a檔案的內容

$nm -s libtest.a

archive index:

hello_world1 in test1.o

hello_world2 in test2.o

test1.o:

00000000 t hello_world1

u puts

test2.o:

00000000 t hello_world2

u puts

現在讓我們編譯主程式

首先退出lib目錄

$cd ..

-l指定了lib的搜尋路徑,-l指定了鏈結的庫的名字-ltest也就是鏈結libtest.a

hello world1

hello_world1()被從libtest.a中找到並鏈結過來了,於是整個的過程中沒有出現問題。

動態庫動 態庫(static lib)也可一也可以成為共享庫(shared lib),一般的字尾名是.so。動態庫與靜態庫有點類似,他們都是一系列的object檔案的集合,只是他們的組織方式不同。同樣他們的鏈結方式也是不 同的,動態庫只在執行是鏈結使用,並不把相應的部分編譯入程式中,在使用是乙個庫可以被多個程式使用故可稱為共享庫,而靜態庫將會整合到程式中,鏈結時各 程式使用自己的庫。

下面我們來介紹如何建立動態庫,還是之前的三個檔案,同樣的布局,進入lib目錄

$gcc -c -fpic  test1.c

$gcc -c -fpic  test2.c

-fpic告訴gcc將源**編譯成共享的object檔案,pic(position-independent code)非位置依賴性**。

$gcc -shared -fpic -o libtest.so test1.o test2.o

將兩個檔案集成為共享庫libtest.so

退出lib目錄

$cd ..

啊哈,我們在這裡遇到乙個error沒找到libtest.so,說明我們的編譯成功了,libtest.so成為了乙個shared libary。程式之所以不能執行是因為libtest.so不在預設的搜尋路徑上

怎樣才能讓他跑呢?

hello world1

我們在自己指定鏈結的路徑,他找到了我們的libtest.so檔案,並且鏈結成功了。

linux下的靜態庫和動態庫

庫是什麼?在我們實際程式設計中,經常會引入各種庫函式,那麼庫是什麼?從本質上來說是一種可執行 的二進位制格式,可以被載入記憶體中執行。庫分靜態庫和動態庫兩種。靜態庫 linux下靜態庫的名字一般是lib a,為庫的名字。利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目標 中,...

linux下的靜態庫和動態庫

意義 為了避免 的重寫率,我們可以將已經寫好的 形成乙個庫,當我們再次用到的時候可以直接呼叫,而不是重新去寫,即 站在巨人的肩膀上 linux下有兩種庫 一 靜態庫 準備工作 int swap int x,int y include int main 1 將我們需要的函式生成乙個.o 檔案 root...

Linux下的靜態庫和動態庫

在我們平時寫 的時候,通常會引用一些庫檔案來幫助我們實現需要的功能,這些庫檔案是別人提前已經寫好的,我們只需要拿出庫檔案的介面來使用就可以了。這種庫檔案分為兩種,一種是靜態庫,一種是動態庫。靜態庫可以簡單的看成一組目標檔案集合,即很多目標檔案經過壓縮打包後形成乙個檔案。在靜態庫的載入過程中,第一步是...