最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

前言

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

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

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

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

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

在解決方案資源管理器的頭文件中添加,mylib.h文件,在源文件添加mylib.c文件(即實(shí)現(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;
}

配置項(xiàng)目屬性。(右擊項(xiàng)目名),因?yàn)檫@是一個(gè)靜態(tài)鏈接庫(kù),所以應(yīng)在項(xiàng)目屬性的“配置屬性”下選擇“常規(guī)”,在其下的配置類(lèi)型中選擇“靜態(tài)庫(kù)(.lib)。

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

 

靜態(tài)庫(kù)的使用

方法一:添加工程中

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

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

說(shuō)明:

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

方法二:配置項(xiàng)目屬性

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

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

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

方法三:使用編譯語(yǔ)句

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

靜態(tài)庫(kù)優(yōu)缺點(diǎn)

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

缺點(diǎn)

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

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

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

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

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

要解決空間浪費(fèi)和更新困難這兩個(gè)問(wèn)題,最簡(jiǎn)單的辦法就是把程序的模塊相互分割開(kāi)來(lái),形成獨(dú)立的文件,而不是將他們靜態(tài)的鏈接在一起。簡(jiǎn)單地講,就是不對(duì)哪些組成程序的目標(biāo)程序進(jìn)行鏈接,等程序運(yùn)行的時(shí)候才進(jìn)行鏈接。也就是說(shuō),把整個(gè)鏈接過(guò)程推遲到了運(yùn)行時(shí)再進(jìn)行,這就是動(dòng)態(tài)鏈接的基本思想。

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

在解決方案資源管理器的頭文件中添加,mydll.h文件,在源文件添加mydll.c文件(即實(shí)現(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;
}

配置項(xiàng)目屬性。因?yàn)檫@是一個(gè)動(dòng)態(tài)鏈接庫(kù),所以應(yīng)在項(xiàng)目屬性的“配置屬性”下選擇“常規(guī)”,在其下的配置類(lèi)型中選擇“動(dòng)態(tài)庫(kù)(.dll)。

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

靜態(tài)庫(kù)中生成的.lib和動(dòng)態(tài)庫(kù)生成的.lib是不同的

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

__declspec(dllexport)是什么意思?

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

動(dòng)態(tài)庫(kù)的lib文件和靜態(tài)庫(kù)的lib文件的區(qū)別?

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

動(dòng)態(tài)庫(kù)的使用

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

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

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

在程序中指定鏈接引用鏈接庫(kù) : #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)庫(kù)的使用中方法一)

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

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

總結(jié)

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

相關(guān)文章

  • C語(yǔ)言容易被忽視的函數(shù)設(shè)計(jì)原則基礎(chǔ)

    C語(yǔ)言容易被忽視的函數(shù)設(shè)計(jì)原則基礎(chǔ)

    C語(yǔ)言的設(shè)計(jì)目標(biāo)是提供一種能以簡(jiǎn)易的方式編譯、處理低級(jí)存儲(chǔ)器、產(chǎn)生少量的機(jī)器碼以及不需要任何運(yùn)行環(huán)境支持便能運(yùn)行的編程語(yǔ)言.那么C語(yǔ)言函數(shù)設(shè)計(jì)的一般原則和技巧都是怎樣的呢,下面帶你了解
    2022-04-04
  • VC++時(shí)鐘函數(shù)

    VC++時(shí)鐘函數(shù)

    VC中提供了很多關(guān)于時(shí)間操作的函數(shù),編寫(xiě)程序時(shí)我們可以跟據(jù)定時(shí)的不同精度要求選擇不同的時(shí)間函數(shù)來(lái)完成定時(shí)和計(jì)時(shí)操作
    2015-06-06
  • C語(yǔ)言基礎(chǔ)野指針與空指針示例分析

    C語(yǔ)言基礎(chǔ)野指針與空指針示例分析

    全網(wǎng)最接地氣的C語(yǔ)言野指針介紹,此處對(duì)于野指針與空指針知識(shí)點(diǎn)做一些簡(jiǎn)要的介紹,作者實(shí)屬初學(xué),難免文章中有內(nèi)容理解不到位或者有不當(dāng)之處,還請(qǐng)朋友們不吝指正,希望大家多多給予支持
    2021-11-11
  • C++函數(shù)返回值為對(duì)象時(shí),構(gòu)造析構(gòu)函數(shù)的執(zhí)行細(xì)節(jié)

    C++函數(shù)返回值為對(duì)象時(shí),構(gòu)造析構(gòu)函數(shù)的執(zhí)行細(xì)節(jié)

    C++函數(shù)返回值為對(duì)象時(shí),構(gòu)造析構(gòu)函數(shù)的執(zhí)行細(xì)節(jié),需要的朋友,可以參考下
    2013-02-02
  • C++基礎(chǔ)之this指針與另一種“多態(tài)”

    C++基礎(chǔ)之this指針與另一種“多態(tài)”

    this指針識(shí)別了同一個(gè)類(lèi)的不同的對(duì)象,換句話(huà)說(shuō),this指針使得成員函數(shù)可以訪(fǎng)問(wèn)同一個(gè)類(lèi)的不同對(duì)象。再深入一點(diǎn),this指針使得成員函數(shù)會(huì)因?yàn)閠his指針的不同而訪(fǎng)問(wèn)到了不同的成員變量
    2013-07-07
  • strcpy函數(shù)實(shí)現(xiàn)簡(jiǎn)示例命分享

    strcpy函數(shù)實(shí)現(xiàn)簡(jiǎn)示例命分享

    這篇文章主要介紹了strcpy函數(shù)實(shí)現(xiàn)簡(jiǎn)示例命,需要的朋友可以參考下
    2014-03-03
  • MFC繪制不規(guī)則窗體的方法

    MFC繪制不規(guī)則窗體的方法

    這篇文章主要介紹了MFC繪制不規(guī)則窗體的方法,涉及MFC窗體操作的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 利用反射獲得類(lèi)的public static/const成員的值實(shí)例

    利用反射獲得類(lèi)的public static/const成員的值實(shí)例

    下面小編就為大家?guī)?lái)一篇利用反射獲得類(lèi)的public static/const成員的值實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • 詳解C++中的const和constexpr

    詳解C++中的const和constexpr

    這篇文章主要為大家介紹了C++中的const和constexpr ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • C++實(shí)現(xiàn)俄羅斯方塊源碼

    C++實(shí)現(xiàn)俄羅斯方塊源碼

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)俄羅斯方塊源碼完整版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評(píng)論

宁河县| 边坝县| 措勤县| 张掖市| 台湾省| 武定县| 宜城市| 永吉县| 怀柔区| 神木县| 广元市| 余庆县| 霸州市| 桃源县| 汉阴县| 扎兰屯市| 临泽县| 博客| 蕲春县| 囊谦县| 临漳县| 光泽县| 黑水县| 三原县| 承德县| 云龙县| 崇明县| 商河县| 富锦市| 长兴县| 安达市| 庆城县| 太湖县| 郎溪县| 邢台市| 许昌市| 鄱阳县| 孝义市| 东丰县| 孟州市| 南昌县|