linux中靜態庫 a 和動態庫 so

2022-04-10 14:49:39 字數 1595 閱讀 5928

**自:

靜態庫

靜態庫在編譯的時候被固定在了可執行檔案中,而不是放在系統的某個地方由ld.so載入。這種做法好的一面是可執行檔案自己包含了所需的所有庫文 件,並不依賴於系統中的其他**,也不會出現庫檔案缺失的情況。你可以把這些**複製給任何人,而它們保證可以工作。不好的一面就是可執行檔案不必要的增 大了,而且不同的程式之間不能共享**。

習慣上,我們以後綴.a來標記靜態庫檔案。

在linux環境中, 使用ar命令建立靜態庫檔案.如下是命令的選項:

d -----從指定的靜態庫檔案中刪除檔案

m -----把檔案移動到指定的靜態庫檔案中

p -----把靜態庫檔案中指定的檔案輸出到標準輸出

q -----快速地把檔案追加到靜態庫檔案中

r -----把檔案插入到靜態庫檔案中

t -----顯示靜態庫檔案中檔案的列表

x -----從靜態庫檔案中提取檔案

還有多個修飾符修改以上基本選項,詳細請man ar 以下列出三個:

a -----把新的目標檔案(*.o)新增到靜態庫檔案中現有檔案之後

b -----***************************************之前

v -----使用詳細模式

ar 命令的命令列格式如下:

ar [-][abcfilnopssuvv] [membername] [count] archive files...

引數archive定義庫的名稱, files是庫檔案中包含的目標檔案的清單, 用空格分隔每個檔案.

比如建立乙個靜態庫檔案的命令如下:

ar r libapue.a error.o errorlog.o lockreg.o

這樣就了libapue.a靜態庫檔案, 可以用 t 選項顯示包含在庫中的檔案

建立庫檔案之後,可以建立這個靜態庫檔案的索引來幫助提高和庫連線的其他程式的編譯速度.使用ranlib程式建立庫的索引,索引存放在庫檔案內部.

ranlib libapue.a

用nm程式顯示存檔檔案的索引,它可以顯示目標檔案的符號

nm libapue.a | more

如果是顯示目標檔案的符號:

nm error.o | more

如何使用呢?如下所示:

gcc -o test test.c libapue.a

這樣就可以在test.c中呼叫在libapue.a中的函式了.

動態庫

對比靜態庫(.a)和動態庫(.so)

使用靜態庫的程式要比使用動態庫的程式稍微快一些。我曾見過有人說兩者之間啟動時間的相差5%的數量級。但是,別忘了,動態庫的好處之一是建立在一

種假定條件下,即這些可執行**已經被載入到了記憶體中.事實上,對於像libc這樣的庫檔案,確實是一直儲存在記憶體中的。如果你要執行乙個使用靜態庫編譯

的 netscape,必然要多等上一點時間。因此,對於「哪種庫檔案更快」這個問題的答案應該是「看情況而定」。但是一般來說,用動態庫編譯的的程式要更快

一些,因為大部分情況下你所需要的庫都已經載入到記憶體中了。

Linux中建立靜態庫和動態庫

我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時 會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在程式執行時還需要 動態庫存在。本文主要通過舉例來說明在linux中如何建立...

Linux中建立靜態庫和動態庫

分類 程式人生 2008 11 05 00 26 257人閱讀 收藏舉報 我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時 會被連線到目標 中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被連線到目標 中,而是在程式執行是才被載入,因此在...

linux中建立靜態庫和動態庫

1.函式庫有兩種 靜態庫和動態庫。靜態庫在程式編譯的時候會被連線到目標 中,程式執行時將不再需要改靜態庫。動態庫中程式編譯的時候並不會連線到目標 中,而是在程式執行時才被載入,因此在程式執行的時候還需要動態庫的存在。程式1 hello.h ifndef hello h define hello h ...