Linux 靜態庫和動態庫

2021-08-18 00:26:27 字數 1669 閱讀 9227

我們指定c程式從**到乙個可執行程式需要經過預處理、編譯、彙編、鏈結。而最後一步鏈結又分為動態鏈結與靜態鏈結。靜態鏈結相當於就是講所要鏈結的庫提前放入鏈結的檔案,這樣子的檔案體積較大,但是可移植性較高。而動態鏈結是在執行的時候才去主動鏈結所需要鏈結的庫,這樣的**體積較小,多個程式共同使用庫的**。我們linux運用的是動態鏈結。

為了方便我們在接下來的內容中測試靜態庫與動態庫,我們編寫乙個簡單的庫。

#pragma once

int add(int a, int b);

#include "add.h"

int add(int a, int b)

#pragma once

int sub(int a, int b);

#include "sub.h"

int sub(int a ,int b)

這裡我們寫了乙個簡單的加與減的庫,便於後續的操作。

我們生成好靜態庫以後這個時候進行測試,我們寫乙個**將靜態庫鏈結到其中,然後刪除掉這個靜態庫,鏈結過後的程式是否能夠執行成功。

我們發現當我們將自己的靜態庫鏈結到test.c檔案後,生成了可執行檔案a.out,然後刪除掉我們的靜態庫,也就是libmymath.a檔案,這時候執行可執行檔案a.out發現是可以執行的,這說明我們的靜態庫在鏈結過後,由作業系統直接將庫里的內容鏈結至目標檔案,所以我們刪除掉自己的庫後檔案照樣可以執行成功。在生成靜態庫的時候ar -rc其中ar是歸檔工具,rc表示replace and create。在進行鏈結的時候,-l選項後加靜態庫的路徑,-l後加所要鏈結靜態庫的名字,靜態庫檔案的字尾是.a

這裡我們同樣利用之前寫的庫來建立自己的動態庫。

這裡-fpic目的是產生位置無關碼,即檔案在任何路徑任何位置都可以鏈結到這個動態庫,那麼就需要經過特殊處理,這個選項目的就是這個。shared表示生成共享庫的格式,也就是類似於動態庫的共享原則,所有檔案都可鏈結。

編譯選項:

我們發現,在將動態庫鏈結成功生成可執行檔案test以後並不能夠執行。這是因為動態庫鏈結時搜尋的時候在其預設的路徑下搜尋,而此時我們的動態庫路徑並不在這個預設的路徑下,所以這時候我們利用export來匯入到這個預設的路徑。

如上圖,匯入以後再利用gcc進行鏈結動態庫,那麼這個時候就可以執行了。

linux 靜態庫和動態庫

1.生成方式 靜態庫 首先將原始檔編譯成目標檔案 gcc c test.c o test.o 然後生成靜態庫 ar rc libstatic.a test.o 共享庫 首先將原始檔編譯成目標檔案 gcc c test.c o test.o 生成共享庫 gcc fpic shared o libsha...

Linux 靜態庫和動態庫

庫有兩種,一種是靜態鏈結庫,一種是動態鏈結庫,不管是哪一種庫,要使用它們,都要在程式中包含相應的include標頭檔案。我們先來回顧一下程式編譯的過程。如下圖 庫 本質乙個目標檔案,這個檔案的字尾有兩種格式,對應兩種庫 缺點是 檔案太大。多次拷貝庫程式,不僅浪費空間,而且檔案體積大 下面實現乙個靜態...

linux靜態庫和動態庫

我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要動態庫存在。靜態庫 是在可執行程式執行之前就已經加入到執行 ...