C語言庫的封裝和使用方法總結

2022-09-24 22:27:11 字數 3203 閱讀 5561

目錄

庫是已經寫好的、成熟的、可復用的**。在我們的開發的應用中經常有一些公共**是需要反覆使用的,就把這些**編譯為庫檔案。

庫可以簡單看成一組目標檔案的集合,將這些目標檔案經過壓縮打包之後形成的乙個檔案。像在windows這樣的平台上,最常用的c語言庫是由整合按開發環境所附帶的執行庫,這些庫一般由編譯廠商提供。

建立乙個新專案,在已安裝的模板中選擇「常規」,在右邊的型別下選擇「空專案」,在名稱和解決方案名稱中輸入staticlib。點選確定。

在解決方案資源管理器的標頭檔案中新增,mylib.**件,在原始檔新增mylib.c檔案(即實現檔案)。

mylib.h

#ifndef mylib_h

#define mylib_h

int myadd(int a, int b);

#endif

mylib.c

# include "mylib.h"

int myadd(int a, int b)

配置專案屬性。(右擊專案名),因為這是乙個靜態鏈結庫,所以應在專案屬性的「配置屬性」下選擇「常規」,在其下的配置型別中選擇「靜態庫(.lib)。

編譯生成新的解決方案,在debug資料夾下會得到mylib.lib (物件檔案庫),將該.lib檔案和相應標頭檔案給使用者,使用者就可以使用該庫里的函式了。

方法一:新增工程中

就像你sibhmxknlx新增.h和.c檔案一樣,把lib檔案新增到工程檔案列表中去。

切換到"解決方案檢視"選中要新增lib的工程–>點選右鍵–>「新增」–>「現有項」–>選擇lib檔案–>確定。

說明:mylib.h可以不引入專案,引入的作用是為了方便使用者了解庫中提供的方法及作用sibhmxknlx。

方法二:配置專案屬性

新增工程的頭檔案目錄:工程—屬性—配置屬性—c/c+–常規—附加包含目錄:加上標頭檔案存放目錄。

新增檔案引用的lib靜態庫路徑:工程—屬性—配置屬性—鏈結器—常規—附加庫目錄:加上lib檔案存放目錄。

然後新增工程引用的lib檔名:工程—屬性—配置屬性—鏈結器—輸入—附加依賴項:加上lib檔名。

方法三:使用編譯語句

#pragma comment(lib,"./mylib.lib")

缺點記憶體和磁碟空間

靜態鏈結這種方法很簡單,原理上也很容易理解,在作業系統和硬體不發達的早期,絕大部程式設計客棧門系統採用這種方案。隨著計算機軟體的發展,這種方法的缺點很快暴露出來,那就是靜態鏈結的方式對於計算機記憶體和磁碟空間浪費非常嚴重。特別是多程序作業系統下,靜態鏈結極大的浪費了記憶體空間。在現在的linux系統中,乙個普通程式會用到c語言靜態庫至少在1mb以上,那麼如果磁碟中有2000個這樣的程式,就要浪費將近2gb的磁碟空間。

程式開發和發布

空間浪費是靜態鏈結的乙個問題,另乙個問題是靜態鏈結對程式的更新、部署和發布也會帶來很多麻煩。比如程式中所使用的mylib.lib是由乙個第三方廠商提供的,當該廠商更新容量mylib.lib的時候,那麼我們的程式就要拿到最新版的mylib.lib,然後將其重新編譯鏈結後,將新的程式整個發布給使用者。這樣的做缺點很明顯,即一旦程式中有任何模組更新,整個程式就要重新編譯鏈結、發布給使用者,使用者要重新安裝整個程式。

要解決空間浪費和更新困難這兩個問題,最簡單的辦法就是把程式的模組相互分割開來,形成獨立的檔案,而不是將他們靜態的鏈結在一起。簡單地講,就是不對哪些組成程式的目標程式進行鏈結,等程式執行的時候才進行鏈結。也就是說,把整個鏈結過程推遲到了執行時再進行,這就是動態鏈結的基本思想。

建立乙個新專案,在已安裝的模板中選擇「常規」,在右邊的型別下選擇「空專案」,在名稱和解決方案名稱中輸入mydll。點選確定。

在解決方案資源管理器的標頭檔案中新增,mydll.**件,在原始檔新增mydll.c檔案(即實現檔案)。

在mydll.**件中新增如下**:

#pragma once

//內部函式

//int mysub(int a, int b);

//外部函式 匯出函式

__declspec(dllexport)int mysub(int a, int b);

5.在test.c檔案中新增如下**:

#include "mydll.h"

// __declspec(dllexport)可以省略

int mysub(int a, int b)

配置專案屬性。因為這是乙個動態鏈結庫,所以應在專案屬性的「配置屬性」下選擇「常規」,在其下的配置型別中選擇「動態庫(.dll)。

編譯生成新的解決方案,在debug資料夾下會得到mydll.dll (物件檔案庫),將該.dll檔案、.lib檔案和相應標頭檔案給使用者,使用者就可以使用該庫里的函式了。

動態庫中的.lib只會放變數的宣告和 匯出函式的宣告,函式實現體放在.dll程式設計客棧中

動態鏈結庫中定義有兩種函式:匯出函式(export function)和內部函式(internal function)。 匯出函式可以被其它模組呼叫,內部函式在定義它們的dll程式內部使用。

在使用動態庫的時候,往往提供兩個檔案:乙個引入庫(.lib)檔案(也稱「導入庫檔案」)和乙個dll(.dll)檔案。雖然引入庫的字尾名也是「lib」,但是,動態庫的引入庫檔案和靜態庫檔案有著本質的區別,對乙個dll檔案來說,其引入庫檔案(.lib)包含該dll匯出的函式和變數的符號名,而.dll檔案包含該dll實際的函式和資料。在使用動態庫的情況下,在編譯鏈結可執行檔案時,只需要鏈結該dll的引入庫檔案,該dll中的函式**和資料並不複製到可執行檔案,直到可執行程式執行時,才去載入所需的dll,將該dll對映到程序的位址空間中,然後訪問dll中匯出的函式。

建立主程式testdll,將mydll.h、mydll.dll和mydll.lib複製到源**目錄下。

(p.s:標頭檔案mydll.h並不是必需的,只是c++中使用外部函式時,需要先進行宣告)

在程式中指定鏈結引用鏈結庫 : #pragma comment(lib,"./mydll.lib")

#include

#include

#include

#pragma comment( lib,"./mydll.lib")

int main()

handle hdll; //宣告乙個dll例項檔案控制代碼

hdll = loadlibrary("mydll.dll"); //匯入動態鏈結庫

myfunc minus_test; //建立函式指標

//獲取匯入函式的函式指標

minus_test = (myfunc)getprocaddress(hdll, "myminus");

C語言中define的全部使用方法總結

自 學習了這麼多年c語言,說實話對巨集自以為瞭如指掌了,沒想到看核心 的時候還是那麼吃力,裝置驅動 中有很多這樣或者那樣的巨集定義,各種define,博主在學習的過程中將c語言中所出現的 define定義整理總結了一下,供大家借鑑和學習。原來以為什麼是巨集?無非就是定義乙個替換的量,好比 defin...

C 語言ofstream的使用方法

檔案讀寫 char s 50 f.read s,49 s 50 0 注意要自己加上字串結束符 char s hello f.write s,strlen s 補充 記得讀寫完成後用f.close 關閉檔案。例子 下面的程式用於刪除帶有行號的源程式中的行號。include include using ...

jQuery 封裝 ajax 的使用方法

1,get請求方式 get 方法 get datatype json succsee function res url 請求的後台程式位址 data 傳送到後台的資料,物件格式 datatype 返回資料的型別,預設為string,如果為json,會自動解析後端返回的json串 succsee 請求...