C++封裝靜態(tài)鏈接庫和使用的詳細(xì)步驟_第1頁
C++封裝靜態(tài)鏈接庫和使用的詳細(xì)步驟_第2頁
C++封裝靜態(tài)鏈接庫和使用的詳細(xì)步驟_第3頁
C++封裝靜態(tài)鏈接庫和使用的詳細(xì)步驟_第4頁
C++封裝靜態(tài)鏈接庫和使用的詳細(xì)步驟_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第C++封裝靜態(tài)鏈接庫和使用的詳細(xì)步驟目錄零碎記事為什么要把程序封裝成庫博主的環(huán)境封裝步驟準(zhǔn)備好待封裝的程序開始封裝配置項(xiàng)目編譯找到編譯好的靜態(tài)庫打包使用靜態(tài)庫使用步驟包含頭文件添加鏈接路徑源文件設(shè)置項(xiàng)目設(shè)置

零碎記事

距離上次發(fā)博客已經(jīng)有一年半了,轉(zhuǎn)眼間我也是從做圖像研究到了做游戲開發(fā),說起來看看前面的博文,本來就有前兆的東西呢(笑)......因?yàn)橹饕€是在使用虛幻引擎,所以C++的東西會(huì)碰到多一些。

以后程序技術(shù)方面的文章就放博客,游戲設(shè)計(jì)相關(guān)的雜談就放知乎那邊吧,博主的知乎可以通過友鏈過去。

B站那邊的賬號也打算開始復(fù)活,后面是更新游戲設(shè)計(jì)雜談?lì)惖囊曨l還是更新虛幻技術(shù)方面的視頻還在猶豫不決......

為什么要把程序封裝成庫

有時(shí)我們需要把自己的程序交給第三方調(diào)用,但是又不想被別人看到自己的具體實(shí)現(xiàn)代碼,就封裝成庫給別人使用。庫有動(dòng)態(tài)鏈接庫和靜態(tài)鏈接庫,區(qū)別是動(dòng)態(tài)鏈接庫可以在程序運(yùn)行時(shí)動(dòng)態(tài)鏈接,而靜態(tài)鏈接庫相當(dāng)于.cpp文件,在編譯時(shí)的鏈接階段就鏈接進(jìn)去了。

博主的環(huán)境

系統(tǒng):Window10

IDE:VS2025

如果在使用的是其他IDE的,看完這個(gè)其實(shí)自己應(yīng)該也能知道用其他IDE該怎么操作,其實(shí)就是一個(gè)對編譯和鏈接過程的理解深度的問題,懂了在哪里都能自己封裝和使用庫的。

這邊的演示有中文路徑,VS對中文路徑支持得確實(shí)還挺可以的,不會(huì)報(bào)錯(cuò)。不過建議大家還是盡量別這樣了,就怕萬一你那邊對中文路徑支持不好,編譯出問題。

封裝步驟

準(zhǔn)備好待封裝的程序

我準(zhǔn)備了一個(gè)Point類,就當(dāng)做是要給別人用的,現(xiàn)在我就把這個(gè)類封裝成靜態(tài)庫。

//Point.h

#pragmaonce

#includeutility

typedefstd::pairint,intCoordinate;

classPoint

private:

Coordinatelocation;

public:

Point();

Point(intx,inty);

CoordinateGetLocation();

intGetX()const;

intGetY()const;

virtualPointoperator+(constPointB)const;

virtualPointoperator-(constPointB)const;

};

//Point.cpp

#include"Point.h"

Point::Point():

location(Coordinate(0,0))

Point::Point(intx,inty):

location(Coordinate(x,y))

CoordinatePoint::GetLocation()

returnlocation;

intPoint::GetX()const

returnlocation.first;

intPoint::GetY()const

returnlocation.second;

PointPoint::operator+(constPointB)const

returnPoint(GetX()+B.GetX(),GetY()+B.GetY());

PointPoint::operator-(constPointB)const

returnPoint();

}

開始封裝

配置項(xiàng)目

平常我們是編譯成可執(zhí)行文件(即.exe),現(xiàn)在我們設(shè)置一下,改成編譯成靜態(tài)庫(即.lib)。

這個(gè)設(shè)置在VS2025里是這樣的:

右擊項(xiàng)目-屬性-配置屬性-常規(guī)-配置類型-改為靜態(tài)庫

這樣我們編譯出來的東西就不是.exe文件,而是.lib文件了,也就是靜態(tài)鏈接庫。

編譯

這邊在VS2025里,編譯就是生成。

就跟編譯普通程序一樣,編譯成功。

找到編譯好的靜態(tài)庫

自己翻翻項(xiàng)目下面的文件夾,能找到編譯出來的靜態(tài)庫的。

我這邊是項(xiàng)目根目錄/x64/Debug/項(xiàng)目名.lib,就是下圖里的那個(gè)Point.lib,這就是靜態(tài)庫。

打包

其實(shí)就是把頭文件跟靜態(tài)庫一起給別人就行了,靜態(tài)庫的作用跟.cpp文件差不多,使用時(shí)就是包含頭文件,然后鏈接到靜態(tài)庫把實(shí)現(xiàn)關(guān)聯(lián)起來即可。

使用靜態(tài)庫使用步驟包含頭文件

新建了個(gè)項(xiàng)目,這個(gè)項(xiàng)目要用到我的那個(gè)Point類,為了方便包含頭文件,我把上邊的那個(gè)有Point.h有和Point.lib的文件夾挪到新項(xiàng)目文件夾下了。

新建了個(gè)程序,要用到我寫的那個(gè)Point類,那就先包含Point.h,里面有關(guān)于Point類的聲明。

//使用靜態(tài)庫.cpp

#includeiostream

#include"大摸魚師千里的Point類/Point.h"

usingnamespacestd;

intmain()

Pointa(1,2);

Pointb(3,4);

Pointc=a+b;

coutc.GetX()","c.GetY()endl;

return0;

}

但是這個(gè)時(shí)候編譯還是通不過的,如下圖報(bào)了無法解析外部符號,是鏈接的錯(cuò)誤來的。頭文件雖然有Point類聲明信息,但沒有實(shí)現(xiàn)的信息,實(shí)現(xiàn)的信息在靜態(tài)庫里,但是現(xiàn)在鏈接器還找不到靜態(tài)庫,所以報(bào)錯(cuò)了。

添加鏈接路徑

有兩種方法,一種是在源文件里設(shè)置,另一種是在項(xiàng)目里設(shè)置。

源文件設(shè)置

先講在源文件里設(shè)置,其實(shí)就是加個(gè)編譯頭告訴鏈接器靜態(tài)庫的路徑而已,語法如下:

#pragmacomment(lib,你的靜態(tài)庫路徑)

這樣子鏈接器在搜索默認(rèn)的庫文件路徑外,還會(huì)搜你這里的設(shè)的靜態(tài)庫路徑。

在我這里,加了就是會(huì)變成這樣:

//使用靜態(tài)庫.cpp

#includeiostream

#include"大摸魚師千里的Point類/Point.h"

usingnamespacestd;

#pragmacomment(lib,"大摸魚師千里的Point類/Point.lib")

intmain()

Pointa(1,2);

Pointb(3,4);

Pointc=a+b;

coutc.GetX()","c.GetY()endl;

return0;

}

因?yàn)殒溄悠髡业铰窂搅?,編譯就能過了,程序正常運(yùn)行,效果如下。

項(xiàng)目設(shè)置

VS2025里是這么設(shè)置鏈接器搜索的庫目錄的

先是設(shè)置庫的目錄,項(xiàng)目屬性-VC++目錄-庫目錄-編輯-新行-把靜態(tài)庫所在目錄添加進(jìn)去

因?yàn)檫@個(gè)時(shí)候只是加了搜索的庫目錄,但是還沒有具體到哪個(gè)庫,可以像上邊那樣用編譯頭來指定,就是不加相對路徑直接指定靜態(tài)庫,就像這樣。

#pragmacomment(l

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論