函式庫一般分為靜態庫和動態庫兩種。

2021-08-17 16:11:17 字數 2725 閱讀 5030

是指編譯鏈結時,把庫檔案的**全部加入到可執行檔案中,因此生成的檔案比較大,但在執行時也就不再需要庫檔案了。其字尾名一般為」.a」。

動態庫:

與之相反,在編譯鏈結時並沒有把庫檔案的**加入到可執行檔案中,而是在程式執行時由執行時鏈結檔案載入庫,這樣可以節省系統的開銷。動態庫一般字尾名為」.so」,gcc/g++在編譯時預設使用動態庫。無論靜態庫,還是動態庫,都是由.o檔案建立的。

下面通過乙個例子來介紹如何生成乙個動態庫。建乙個標頭檔案:dynamic.h,三個.cpp檔案:dynamic_a.cpp、dynamic_b.cpp、dynamic_c.cpp,我們將這幾個檔案編譯成乙個動態庫:libdynamic.so。

#ifndef __dynamic_h_

#define __dynamic_h_

#include void dynamic_a();

void dynamic_b();

void dynamic_c();

#endif

//dynamic_a.cpp:

#include"dynamic.h"

void dynamic_a()

將main.cpp與libdynamic.so鏈結成乙個可執行檔案main。命令如下:

g++ main.cpp -l. -ldynamic -o main
-l.:表示要連線的庫在當前目錄中

-ldynamic:編譯器查詢動態連線庫時有隱含的命名規則,即在給出的名字前面加上lib,後面加上.so來確定庫的名稱

測試可執行程式main是否已經鏈結的動態庫libdynamic.so,如果列出了libdynamic.so,那麼就說明正常鏈結了。可以執行以下命令:

如果執行:

./main
出現錯誤:error while loading shared libraries: libdynamic.so: cannot open shared object file: no such file or directory

ld提示找不到庫檔案,而庫檔案就在當前目錄中。

鏈結器ld預設的目錄是/lib和/usr/lib,如果放在其他路徑也可以,需要讓ld知道庫檔案在**。

編輯/etc/ld.so.conf檔案,在新的一行中加入庫檔案所在目錄;比如筆者應新增:

/home/neu/code/dynamic_library

執行:

sudo ldconfig
目的是用ldconfig載入,以更新/etc/ld.so.cache檔案;

在/etc/ld.so.conf.d/目錄下新建任何以.conf為字尾的檔案,在該檔案中加入庫檔案所在的目錄;

執行:

sudo ldconfig
以更新/etc/ld.so.cache檔案;

ld.so.cache的更新是遞增式的,就像path系統環境變數一樣,不是從頭重新建立,而是向上累加。除非重新開機,才是從零開始建立ld.so.cache檔案。

在bashrc或profile檔案裡用ld_library_path定義,然後用source載入。

你可以直接採用在編譯鏈結的時候告訴系統你的庫在什麼地方

執行main可以看看main是否呼叫了動態鏈結庫中的函式。

讀者可以自己建立**,筆者比較懶,就以以上**演示,最好把生成的動態庫的東西全部刪掉。

1.編譯靜態庫:

g++ -c dynamic_a.cpp dynamic_b.cpp dynamic_c.cpp
2.使用ar命令建立靜態庫檔案(把目標文件歸檔)

ar cr libstatic.a dynamic_a.o dynamic_b.o dynamic_c.o  //

cr標誌告訴ar將object檔案封裝(archive)

引數說明:

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

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

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

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

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

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

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

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

使用nm -s 命令來檢視.a檔案的內容

3.鏈結靜態庫

g++ main.cpp -lstatic -l. -static -o main//這裡的-static選項是告訴編譯器,hello是靜態庫也可以用

//g++ main.cpp -lstatic -l.  -o main 

執行以下命令,因為筆者還是用的動態庫的**,所以結果一樣

函式庫的靜態庫和動態庫

函式庫分為靜態庫和動態庫兩種 靜態庫在程式編譯是會被鏈結到目標 中,執行時不再需要 動態庫在程式執行時並不會被鏈結,在程式執行時才被載入 靜態庫製作 1.自己編寫源 c 2.對製作的原始檔進行只編譯不鏈結.o gcc.c c o o 3.對目標檔案進行打包 ar rc libyyy.a yyy庫名 ...

程式設計 函式庫 動態庫 靜態庫

通常被認為是函式庫,說白了就是乙個檔案,檔案中包含大量的函式實現的二進位制 指令 比如我們所使用printf函式 動態庫 鏈結動態庫生成可執行程式,並沒有把庫中函式的實現指令直接拿過來寫入可執行程式中,而是在可執行程式中記錄了庫中函式的符號資訊。優缺點 生成可執行程式比較小,執行時動態庫被載入到記憶...

Linux的靜態函式庫和動態函式庫

一 在linux中,有兩種函式庫,以 so字尾命名的是動態函式庫,以 a字尾命名的是靜態函式庫 二 靜態函式庫 1 靜態函式庫是多個目標檔案 o的集合 2 可以使用ar命令 archiver 來生成.a檔案 gcc c part a.c gcc c part b.c ar r libtest.a p...