C語言中靜態庫和動態庫筆記

2021-09-08 10:18:48 字數 1987 閱讀 5503

庫,故名思議,是存放東西的地方,其中存放的東西可以被多個人公用。

程式中借用庫的概念,描述將**進行抽取,這種**被大多數程式使用,

其過程具有一定的模組化、封裝、抽象的特徵。

按照庫的使用方式, 靜態庫 和 動態庫。

不管怎樣方式使用, 首先庫的概念體現出**邏輯上公共抽象。

靜態庫,編譯應用程式的過程中, 就將**編譯進去引用程式,

使用上, 只要引用庫的開放標頭檔案, 在應用**中就像引用應用自己的函式一樣。  

對於這種庫,

linux編譯的字尾為 .a (archive, 從命名上可以看出,僅僅是歸檔的作用, 跟資料夾和若干相關的檔案關係類似)  

windows為.lib (library)

動態庫,在編譯階段,沒有將庫檔案編譯進入應用,

而是在執行階段,將動態庫載入到記憶體開啟,按照函式名找到函式後執行, 

在應用編碼中, 使用特有的動態庫介面來 開啟庫, 找函式, 關閉庫等,具體介面跟平台有關:

windows : 

linux:

windows編譯動態庫檔案的字尾為 .dll (dynamic library linker)

linux的動態庫檔案為.so (shared object  = 從使用場景給了最好的解釋, 首先是executable object, 然後各個程式都可以執行階段動態分享 shared)

與靜態庫相比,

(1)動態庫更加省記憶體,只在需要的時候載入。

(2)省空間,如果多個程式引用, 只有乙份目標檔案大小, 靜態庫是各個應用都編譯進去。

(3)使用方式更加靈活,可以對庫更加靈活替換或者公升級。  

所以對於本地應用開發, 系統都提供了一些本地應用庫,給開發者使用,例如c庫 libc.so。

本實驗使用c-free作為編譯開發執行環境。 c-free download address 

做乙個加法計算的動態庫,然後由應用呼叫。

靜態庫-libstatic.a

addfunclib.cpp

#include "

addfunclib.h

"int add(int x,int

y)

addfunclib.h

#ifndef lib_h

#define lib_h

extern"c

"int add(int x,int y); //

宣告為c編譯、連線方式的外部函式

#endif

應用 編譯時候,需要將libstatic.a新增到此工程。

calladdfunc.cpp

#include #include 

".\\addfunclib.h

"int main(int argc, char*ar**)

環境和例項與靜態庫一致。

動態庫-libshared.dll

addfunclib.cpp

#include "

.\\addfunclib.h

"int add(int x,int

y)

addfunclib.h

#ifndef lib_h

#define lib_h

extern"c

"int __declspec(dllexport)add(int x, int

y);#endif

應用 執行前,需要將ibshared.dll新增到此目標檔案路徑。

calladdfunc.cpp

#include #include 

typedef

int(*lpaddfun)(int, int); //

巨集定義函式指標型別

int main(int argc, char *ar**)

freelibrary(hdll);

}return0;

}

C語言 靜態庫與動態庫

一.靜態庫 靜態庫 要被包含到源程式中的庫 1.優點執行速度快 2.缺點占用系統資源比較多 3.使用的場合對時間要求很高的場合 4.靜態庫的製作 1 把所有的源程式 c檔案 製作成目標檔案 o 檔案 gcc c mul.c o mul.o gcc c sub.c o sub.o gcc c add....

c 呼叫靜態庫和動態庫

呼叫靜態庫 第一步把動態庫放到檔案裡 第二部連線上靜態庫 pragma comment lib,靜態庫.lib 呼叫動態庫 第一步 typedef int getmaxnum int,int 定義乙個函式指標型別 第二部 載入 dll hmodule hmodule loadlibrary mydl...

018 C語言靜態庫動態庫

linux下 c語言程式設計環境 頭檔案目錄 usr include 庫目錄 usr lib 動態庫與靜態庫的區別 在電腦程式源 需要通過翻譯 彙編 鏈結過程而生成可執行檔案,再由載入器載入到記憶體,兩者區別就在於程式載入時鏈結到相應庫的方式不同,程式編譯時指定了靜態庫,編譯後可直接執行,而編譯時指...