C++封裝靜態(tài)鏈接庫和使用的詳細(xì)步驟
零碎記事
距離上次發(fā)博客已經(jīng)有一年半了,轉(zhuǎn)眼間我也是從做圖像研究到了做游戲開發(fā),說起來看看前面的博文,本來就有前兆的東西呢(笑)......因為主要還是在使用虛幻引擎,所以C++的東西會碰到多一些。
以后程序技術(shù)方面的文章就放博客,游戲設(shè)計相關(guān)的雜談就放知乎那邊吧,博主的知乎可以通過友鏈過去。
B站那邊的賬號也打算開始復(fù)活,后面是更新游戲設(shè)計雜談類的視頻還是更新虛幻技術(shù)方面的視頻還在猶豫不決......
為什么要把程序封裝成庫
有時我們需要把自己的程序交給第三方調(diào)用,但是又不想被別人看到自己的具體實現(xiàn)代碼,就封裝成庫給別人使用。庫有動態(tài)鏈接庫和靜態(tài)鏈接庫,區(qū)別是動態(tài)鏈接庫可以在程序運(yùn)行時動態(tài)鏈接,而靜態(tài)鏈接庫相當(dāng)于.cpp文件,在編譯時的鏈接階段就鏈接進(jìn)去了。
博主的環(huán)境
系統(tǒng):Window 10
IDE:VS2022
如果在使用的是其他IDE的,看完這個其實自己應(yīng)該也能知道用其他IDE該怎么操作,其實就是一個對編譯和鏈接過程的理解深度的問題,懂了在哪里都能自己封裝和使用庫的。
這邊的演示有中文路徑,VS對中文路徑支持得確實還挺可以的,不會報錯。不過建議大家還是盡量別這樣了,就怕萬一你那邊對中文路徑支持不好,編譯出問題。
封裝步驟
準(zhǔn)備好待封裝的程序
我準(zhǔn)備了一個Point類,就當(dāng)做是要給別人用的,現(xiàn)在我就把這個類封裝成靜態(tài)庫。
//Point.h
#pragma once
#include <utility>
typedef std::pair<int, int> Coordinate;
class Point
{
private:
Coordinate location;
public:
Point();
Point(int x, int y);
Coordinate GetLocation();
int GetX() const;
int GetY() const;
virtual Point operator + (const Point& B) const;
virtual Point operator - (const Point& B) const;
};//Point.cpp
#include "Point.h"
Point::Point() :
location(Coordinate(0, 0))
{
}
Point::Point(int x, int y):
location(Coordinate(x, y))
{
}
Coordinate Point::GetLocation()
{
return location;
}
int Point::GetX() const
{
return location.first;
}
int Point::GetY() const
{
return location.second;
}
Point Point::operator+(const Point& B) const
{
return Point(GetX()+B.GetX(), GetY()+B.GetY());
}
Point Point::operator-(const Point& B) const
{
return Point();
}開始封裝
配置項目
平常我們是編譯成可執(zhí)行文件(即.exe),現(xiàn)在我們設(shè)置一下,改成編譯成靜態(tài)庫(即.lib)。
這個設(shè)置在VS2022里是這樣的:
右擊項目->屬性->配置屬性->常規(guī)->配置類型->改為靜態(tài)庫


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

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

找到編譯好的靜態(tài)庫
自己翻翻項目下面的文件夾,能找到編譯出來的靜態(tài)庫的。
我這邊是 項目根目錄/x64/Debug/項目名.lib,就是下圖里的那個Point.lib,這就是靜態(tài)庫。

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

使用靜態(tài)庫使用步驟包含頭文件
新建了個項目,這個項目要用到我的那個Point類,為了方便包含頭文件,我把上邊的那個有Point.h有和Point.lib的文件夾挪到新項目文件夾下了。

新建了個程序,要用到我寫的那個Point類,那就先包含Point.h,里面有關(guān)于Point類的聲明。
//使用靜態(tài)庫.cpp
#include <iostream>
#include "大摸魚師千里的Point類/Point.h"
using namespace std;
int main()
{
Point a(1, 2);
Point b(3, 4);
Point c = a + b;
cout << c.GetX() << ", " << c.GetY() << endl;
return 0;
}但是這個時候編譯還是通不過的,如下圖報了“無法解析外部符號”,是鏈接的錯誤來的。頭文件雖然有Point類聲明信息,但沒有實現(xiàn)的信息,實現(xiàn)的信息在靜態(tài)庫里,但是現(xiàn)在鏈接器還找不到靜態(tài)庫,所以報錯了。

添加鏈接路徑
有兩種方法,一種是在源文件里設(shè)置,另一種是在項目里設(shè)置。
源文件設(shè)置
先講在源文件里設(shè)置,其實就是加個編譯頭告訴鏈接器靜態(tài)庫的路徑而已,語法如下:
#pragma comment(lib, 你的靜態(tài)庫路徑)
這樣子鏈接器在搜索默認(rèn)的庫文件路徑外,還會搜你這里的設(shè)的靜態(tài)庫路徑。
在我這里,加了就是會變成這樣:
//使用靜態(tài)庫.cpp
#include <iostream>
#include "大摸魚師千里的Point類/Point.h"
using namespace std;
#pragma comment(lib, "大摸魚師千里的Point類/Point.lib")
int main()
{
Point a(1, 2);
Point b(3, 4);
Point c = a + b;
cout << c.GetX() << ", " << c.GetY() << endl;
return 0;
}因為鏈接器找到路徑了,編譯就能過了,程序正常運(yùn)行,效果如下。

項目設(shè)置
VS2022里是這么設(shè)置鏈接器搜索的庫目錄的
先是設(shè)置庫的目錄,項目屬性->VC++目錄->庫目錄->編輯->新行->把靜態(tài)庫所在目錄添加進(jìn)去




因為這個時候只是加了搜索的庫目錄,但是還沒有具體到哪個庫,可以像上邊那樣用編譯頭來指定,就是不加相對路徑直接指定靜態(tài)庫,就像這樣。
#pragma comment(lib, "Point.lib")
現(xiàn)在講怎么在項目里配置具體到指定庫。
項目屬性->鏈接器->輸入->附加依賴項->編輯->添加你的庫



設(shè)完就是不加編譯頭也能編譯運(yùn)行程序了,這是效果

以上就是C++封裝庫和使用的全部內(nèi)容了,覺得有學(xué)到的話可以點個贊嘿嘿。
到此這篇關(guān)于C++封裝靜態(tài)鏈接庫和使用的文章就介紹到這了,更多相關(guān)C++靜態(tài)鏈接庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Eclipse中C++連接mysql數(shù)據(jù)庫
這篇文章主要為大家詳細(xì)介紹了Eclipse中C++連接mysql數(shù)據(jù)庫 ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06
select函數(shù)實現(xiàn)高性能IO多路訪問的關(guān)鍵示例深入解析
這篇文章主要為大家介紹了select函數(shù)實現(xiàn)高性能IO多路訪問的關(guān)鍵示例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09

