欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言庫的封裝和使用方法總結(jié)

 更新時間:2021年07月13日 10:22:35   作者:DevCsdner  
在編程的過程中,使用已經(jīng)封裝好的庫函數(shù)是十分方便的,也是十分高效的,這篇文章主要給大家介紹了關(guān)于C語言庫的封裝和使用的相關(guān)資料,需要的朋友可以參考下

前言

庫是已經(jīng)寫好的、成熟的、可復(fù)用的代碼。在我們的開發(fā)的應(yīng)用中經(jīng)常有一些公共代碼是需要反復(fù)使用的,就把這些代碼編譯為庫文件。

庫可以簡單看成一組目標文件的集合,將這些目標文件經(jīng)過壓縮打包之后形成的一個文件。像在Windows這樣的平臺上,最常用的c語言庫是由集成按開發(fā)環(huán)境所附帶的運行庫,這些庫一般由編譯廠商提供。

windows下靜態(tài)庫創(chuàng)建和使用

靜態(tài)庫的創(chuàng)建

創(chuàng)建一個新項目,在已安裝的模板中選擇“常規(guī)”,在右邊的類型下選擇“空項目”,在名稱和解決方案名稱中輸入staticlib。點擊確定。

在解決方案資源管理器的頭文件中添加,mylib.h文件,在源文件添加mylib.c文件(即實現(xiàn)文件)。

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) {
	return a + b;
}

配置項目屬性。(右擊項目名),因為這是一個靜態(tài)鏈接庫,所以應(yīng)在項目屬性的“配置屬性”下選擇“常規(guī)”,在其下的配置類型中選擇“靜態(tài)庫(.lib)。

編譯生成新的解決方案,在Debug文件夾下會得到mylib.lib (對象文件庫),將該.lib文件和相應(yīng)頭文件給用戶,用戶就可以使用該庫里的函數(shù)了。

 

靜態(tài)庫的使用

方法一:添加工程中

就像你添加.h和.c文件一樣,把lib文件添加到工程文件列表中去。

切換到"解決方案視圖"選中要添加lib的工程–>點擊右鍵–>“添加”–>“現(xiàn)有項”–>選擇lib文件–>確定。

說明:

mylib.h可以不引入項目,引入的作用是為了方便用戶了解庫中提供的方法及作用。

方法二:配置項目屬性

添加工程的頭文件目錄:工程—屬性—配置屬性—c/c+±–常規(guī)—附加包含目錄:加上頭文件存放目錄。

添加文件引用的lib靜態(tài)庫路徑:工程—屬性—配置屬性—鏈接器—常規(guī)—附加庫目錄:加上lib文件存放目錄。

然后添加工程引用的lib文件名:工程—屬性—配置屬性—鏈接器—輸入—附加依賴項:加上lib文件名。

方法三:使用編譯語句

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

靜態(tài)庫優(yōu)缺點

  •  靜態(tài)庫對函數(shù)庫的鏈接是放在編譯時期完成的,靜態(tài)庫在程序的鏈接階段被復(fù)制到了程序中,和程序運行的時候沒有關(guān)系;
  • 程序在運行時與函數(shù)庫再無瓜葛,移植方便。
  • 浪費空間和資源,所有相關(guān)的目標文件與牽涉到的函數(shù)庫被鏈接合成一個可執(zhí)行文件。

缺點

內(nèi)存和磁盤空間

靜態(tài)鏈接這種方法很簡單,原理上也很容易理解,在操作系統(tǒng)和硬件不發(fā)達的早期,絕大部門系統(tǒng)采用這種方案。隨著計算機軟件的發(fā)展,這種方法的缺點很快暴露出來,那就是靜態(tài)鏈接的方式對于計算機內(nèi)存和磁盤空間浪費非常嚴重。特別是多進程操作系統(tǒng)下,靜態(tài)鏈接極大的浪費了內(nèi)存空間。在現(xiàn)在的linux系統(tǒng)中,一個普通程序會用到c語言靜態(tài)庫至少在1MB以上,那么如果磁盤中有2000個這樣的程序,就要浪費將近2GB的磁盤空間。

程序開發(fā)和發(fā)布

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

windows下動態(tài)庫創(chuàng)建和使用

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

創(chuàng)建一個新項目,在已安裝的模板中選擇“常規(guī)”,在右邊的類型下選擇“空項目”,在名稱和解決方案名稱中輸入mydll。點擊確定。

在解決方案資源管理器的頭文件中添加,mydll.h文件,在源文件添加mydll.c文件(即實現(xiàn)文件)。

在mydll.h文件中添加如下代碼:

#pragma once
//內(nèi)部函數(shù)
//int mySub(int a, int b);

//外部函數(shù) 導(dǎo)出函數(shù)
__declspec(dllexport)int mySub(int a, int b);

5.在test.c文件中添加如下代碼:

#include "mydll.h"
// __declspec(dllexport)可以省略
int mySub(int a, int b) {
	return a - b;
}

配置項目屬性。因為這是一個動態(tài)鏈接庫,所以應(yīng)在項目屬性的“配置屬性”下選擇“常規(guī)”,在其下的配置類型中選擇“動態(tài)庫(.dll)。

編譯生成新的解決方案,在Debug文件夾下會得到mydll.dll (對象文件庫),將該.dll文件、.lib文件和相應(yīng)頭文件給用戶,用戶就可以使用該庫里的函數(shù)了。

靜態(tài)庫中生成的.lib和動態(tài)庫生成的.lib是不同的

動態(tài)庫中的.lib只會放變量的聲明和 導(dǎo)出函數(shù)的聲明,函數(shù)實現(xiàn)體放在.dll中

__declspec(dllexport)是什么意思?

動態(tài)鏈接庫中定義有兩種函數(shù):導(dǎo)出函數(shù)(export function)和內(nèi)部函數(shù)(internal function)。 導(dǎo)出函數(shù)可以被其它模塊調(diào)用,內(nèi)部函數(shù)在定義它們的DLL程序內(nèi)部使用。

動態(tài)庫的lib文件和靜態(tài)庫的lib文件的區(qū)別?

在使用動態(tài)庫的時候,往往提供兩個文件:一個引入庫(.lib)文件(也稱“導(dǎo)入庫文件”)和一個DLL(.dll)文件。雖然引入庫的后綴名也是“l(fā)ib”,但是,動態(tài)庫的引入庫文件和靜態(tài)庫文件有著本質(zhì)的區(qū)別,對一個DLL文件來說,其引入庫文件(.lib)包含該DLL導(dǎo)出的函數(shù)和變量的符號名,而.dll文件包含該DLL實際的函數(shù)和數(shù)據(jù)。在使用動態(tài)庫的情況下,在編譯鏈接可執(zhí)行文件時,只需要鏈接該DLL的引入庫文件,該DLL中的函數(shù)代碼和數(shù)據(jù)并不復(fù)制到可執(zhí)行文件,直到可執(zhí)行程序運行時,才去加載所需的DLL,將該DLL映射到進程的地址空間中,然后訪問DLL中導(dǎo)出的函數(shù)。

動態(tài)庫的使用

方法一:隱式調(diào)用

創(chuàng)建主程序TestDll,將mydll.h、mydll.dll和mydll.lib復(fù)制到源代碼目錄下。

(P.S:頭文件mydll.h并不是必需的,只是C++中使用外部函數(shù)時,需要先進行聲明)

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

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

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

int main(){

	printf("10 - 20 = %d\n", mySub(10, 20));


	system("pause");
	return EXIT_SUCCESS;
}

方法二:添加工程中(如靜態(tài)庫的使用中方法一)

方法三:顯式調(diào)用

	HANDLE hDll; //聲明一個dll實例文件句柄
	hDll = LoadLibrary("mydll.dll"); //導(dǎo)入動態(tài)鏈接庫
	MYFUNC minus_test; //創(chuàng)建函數(shù)指針
	//獲取導(dǎo)入函數(shù)的函數(shù)指針
	minus_test = (MYFUNC)GetProcAddress(hDll, "myminus");

總結(jié)

到此這篇關(guān)于C語言庫的封裝和使用方法的文章就介紹到這了,更多相關(guān)C語言庫的封裝使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解C語言基礎(chǔ)的類型轉(zhuǎn)換

    詳解C語言基礎(chǔ)的類型轉(zhuǎn)換

    這篇文章主要為大家介紹了C語言基礎(chǔ)的類型轉(zhuǎn)換,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • 詳解C語言中rand函數(shù)的使用

    詳解C語言中rand函數(shù)的使用

    在編程時我們有時總希望自己產(chǎn)生一個隨機數(shù)字,以供使用,那么下面介紹rand函數(shù)的使用,有需要的可以參考學習。
    2016-08-08
  • C++中可正確獲取UTF-8字符長度的函數(shù)分享

    C++中可正確獲取UTF-8字符長度的函數(shù)分享

    這篇文章主要介紹了C++中可正確獲取UTF-8字符長度的函數(shù)分享,需要的朋友可以參考下
    2014-08-08
  • VisualStudio2022制作多項目模板及Vsix插件的實現(xiàn)

    VisualStudio2022制作多項目模板及Vsix插件的實現(xiàn)

    本文主要介紹了VisualStudio2022制作多項目模板及Vsix插件的實現(xiàn),文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-06-06
  • 深入淺析C/C++?的條件編譯

    深入淺析C/C++?的條件編譯

    條件編譯是指預(yù)處理的時候根據(jù)條件編譯的指令有條件的選擇源程序中的一部分代碼送給編譯器進行編譯,進行有選擇性的操作,防止宏替換的內(nèi)容重復(fù)包含,這篇文章主要介紹了C/C++?的條件編譯,需要的朋友可以參考下
    2022-04-04
  • C語言源碼實現(xiàn)俄羅斯方塊

    C語言源碼實現(xiàn)俄羅斯方塊

    這篇文章主要為大家詳細介紹了C語言源碼實現(xiàn)俄羅斯方塊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • C語言二叉樹層序遍歷

    C語言二叉樹層序遍歷

    這篇文章主要介紹了C語言二叉樹層序遍歷,文章基于C語言的相關(guān)資料展開詳細的文章內(nèi)容,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-04-04
  • C/C++?Qt?數(shù)據(jù)庫與TreeView組件綁定詳解

    C/C++?Qt?數(shù)據(jù)庫與TreeView組件綁定詳解

    本篇文章主要介紹了QT數(shù)據(jù)庫與View組件的綁定,通過數(shù)據(jù)庫與組件關(guān)聯(lián)可實現(xiàn)動態(tài)展示數(shù)據(jù)庫中的表記錄。感興趣的小伙伴可以了解一下
    2021-12-12
  • Qt學習之容器類的使用教程詳解

    Qt學習之容器類的使用教程詳解

    Qt提供了多個基于模板的容器類,這些類可以用于存儲指定類型的數(shù)據(jù)項。本文主要介紹了Qt常用容器類的使用,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-12-12
  • C語言快速排序與二分查找算法示例

    C語言快速排序與二分查找算法示例

    這篇文章主要介紹了C語言快速排序與二分查找算法,涉及C語言隨機數(shù)生成、快速排序及二分查找等算法相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2018-01-01

最新評論