0 代碼倉(cāng)庫(kù)及視頻
0.1 Github代碼倉(cāng)庫(kù)位置
https://github.com/Chufeng-Jiang/OpenSSL_Secure_Data_Transmission_Platform/tree/main/Protobuf
0.2 視頻
0.2.1 Centos7
https://www.bilibili.com/video/BV1we411R7sS/?vd_source=3353f83539e46042d8cf76efb177a8e4
06-Protobuf在Centos7系統(tǒng)上的安裝:版本protobuf3.17.2
0.2.2 windows
https://www.bilibili.com/video/BV1rw411X7mY/?spm_id_from=333.999.0.0&vd_source=3353f83539e46042d8cf76efb177a8e4
05-Protobuf在Windows系統(tǒng)上的安裝:版本protobuf3.17+cmake+vs2022
1 Windows環(huán)境配置
在windows下配置,無(wú)論protobuf是什么版本,IDE和編譯器的版本都要保持一致。
比如,protobuf的cpp使用在cmake生成工程的時(shí)候選擇了對(duì)應(yīng)的IDE及A編譯器,就應(yīng)該在同樣使用A編譯器的及對(duì)應(yīng)版本的IDE上運(yùn)行,否則容易報(bào)錯(cuò)。
我使用cmake3.27,因?yàn)閏make3.27在configure的時(shí)候有vs2022的選項(xiàng),但是別的版本不一定有vs2022。在使用cmake3.27對(duì)protobuf3.17.2源文件生成工程后,對(duì)應(yīng)的輸出文件夾下會(huì)生成vs的sln文件,再使用對(duì)應(yīng)版本的vs2022進(jìn)行編譯,生成protoc執(zhí)行文件和庫(kù)文件。
這里面有一個(gè)坑,在vs2022進(jìn)行編譯的時(shí)候,如果使用debug對(duì)protobuf-cpp工程進(jìn)行編譯生成庫(kù)文件,那么后期在使用庫(kù)文件時(shí)候,就要在對(duì)應(yīng)的工程上指定相應(yīng)的運(yùn)行庫(kù)和附加依賴(lài)項(xiàng)目,即“XXXd”版本。
1.1 配置環(huán)境:
操作系統(tǒng):windows10
Visual Studio:vs2022社區(qū)版
Cmake版本:cmake3.27.7
Protobuf版本:protobuf3.17.2和對(duì)應(yīng)的cpp文件包
1.2 安裝編譯
具體的安裝過(guò)程可以參考以下視頻,大概半個(gè)小時(shí)就弄好了。
protobuf的安裝:版本protobuf3.17.2+cmake+vs2022
- https://www.bilibili.com/video/BV1rw411X7mY/
選中Shared Libs,以后生成的就是靜態(tài)庫(kù)。
以Debug版本為例:
- 我先勾選Shared Libs,生成了sln工程,在sln工程中編譯生成了靜態(tài)庫(kù);
- 然后沒(méi)有勾選了Shared Libs,生成了sln工程,在sln工程中編譯生成了動(dòng)態(tài)庫(kù)。
1.3 配置VS
生成庫(kù)文件之后—>參考3.3 配置VS
2 Linux Centos環(huán)境配置
2.1 下載必要的編譯環(huán)境
sudo yum install autoconf automake libtool curl make gcc-c++ unzip
2.2 下載Linux上用的壓縮包
https://github.com/protocolbuffers/protobuf/releases?page=7
2.2.1 將包發(fā)送到Linux服務(wù)器上并解壓縮
sudo tar -zxvf protobuf-all-3.17.2.tar.gz
2.2.2 進(jìn)入到壓縮包所在的文件夾配置configure
這里我們是把protobuf安裝在了系統(tǒng)目錄下,因此使用的時(shí)候只有root用戶(hù)能使用protoc相關(guān)的命令和庫(kù)文件、頭文件。
如果是需要使用普通用戶(hù)對(duì)程序進(jìn)行編譯,需要在相應(yīng)的用戶(hù)目錄下配置protobuf環(huán)境。
sudo ./configure --prefix=
/home/beza/protobuf
這里我們?cè)谙到y(tǒng)下進(jìn)行配置:
sudo ./configure --prefix=/usr/local/protobuf
2.2.3 運(yùn)行makefile文件
sudo make
----------漫長(zhǎng)的等待-----------
2.2.4 make install將文件安裝到2.2.2設(shè)置的目錄中
sudo make install
很快就安裝好了
2.2.5 在2.2.2配置的目錄下就會(huì)有bin/lib/include,相關(guān)文件均配置好
2.3 修改環(huán)境變量
sudo vim /etc/profile
# 添加內(nèi)容如下:
#(動(dòng)態(tài)庫(kù)搜索路徑) 程序加載運(yùn)行間查找動(dòng)態(tài)鏈接庫(kù)時(shí)指定除了系統(tǒng)默認(rèn)路徑之外的其他路徑
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/protobuf/lib/
#(靜態(tài)庫(kù)搜索路徑) 程序編譯期間查找動(dòng)態(tài)鏈接庫(kù)時(shí)指定查找共享庫(kù)的路徑
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/protobuf/lib/
#執(zhí)行程序搜索路徑
export PATH=$PATH:/usr/local/protobuf/bin/
#c程序頭文件搜索路徑
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/protobuf/include/
#c++程序頭文件搜索路徑
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/protobuf/include/
2.4 驗(yàn)證安裝
protoc --version
source /etc/profile
Q:程序使用protobuf,編譯沒(méi)有問(wèn)題,運(yùn)行時(shí)一到建立protobuf對(duì)象就崩潰
后來(lái)偶然看到以前正常使用的makefile文件中后面加了-lpthread,加上就好了。我自己的程序沒(méi)有用到多線程,應(yīng)該是protobuf3里面用到了。
2.5 編譯的時(shí)候要加上
g++ XXX.cpp -L/usr/local/protobuf/include -lprotobuf
三、Wnidows環(huán)境下protobuf測(cè)試
假設(shè)要序列化的數(shù)據(jù)為
// 要序列化的數(shù)據(jù)
struct Persion
{
int id;
string name;
string sex; // man woman
int age;
};
3.1 新建.proto文件生成相應(yīng)的類(lèi)
syntax = "proto3";
message Persion
{
int32 id = 1; // 編號(hào)從1開(kāi)始
repeated bytes name = 2;
string sex = 3;
int32 age = 4;
}
新建.proto文件
syntax = "proto3";
message Persion
{
int32 id = 1; // 編號(hào)從1開(kāi)始
repeated bytes name = 2;
string sex = 3;
int32 age = 4;
}
打開(kāi)終端輸入命令,自動(dòng)生成相應(yīng)的類(lèi),可以直接放到工程中用
protoc Persion.proto --cpp_out=./
3.2 .proto生成相應(yīng)的類(lèi)的使用
創(chuàng)建一個(gè)空項(xiàng)目,把上面生成的類(lèi)放到工程文件下并添加現(xiàn)有項(xiàng)
3.3 配置VS
在工程中添加編譯好的類(lèi)文件
接下來(lái)的步驟比較關(guān)鍵
1. 先將平臺(tái)設(shè)置為所有平臺(tái)
2. 配置屬性 >> C/C++ >> 常規(guī) >> 附加包含目錄
選擇google文件夾所在的目錄,應(yīng)該是下載的protobuf對(duì)應(yīng)版本下的src文件夾,也可以單獨(dú)拿出來(lái),我的是:
D:\ProgramData\protobuf\protobuf-3.17.2\src
3. 配置屬性 >> C/C++ >> 預(yù)處理器 >> 預(yù)處理器定義,添加
_CONSOLE;
_SCL_SECURE_NO_WARNINGS;
_PROTOBUF_USE_DLLS
4. 配置屬性 >> C/C++ >> 代碼生成 >> 運(yùn)行庫(kù) ,選擇:多線程調(diào)試(/Mtd)
在使用Visual Studio鏈接依賴(lài)庫(kù)時(shí),經(jīng)常性的會(huì)出現(xiàn)下面幾種錯(cuò)誤
error LNK2038: 檢測(cè)到“RuntimeLibrary”的不匹配項(xiàng):
值“MT_StaticRelease”不匹配值“MTd_StaticDebug”
error LNK2038: 檢測(cè)到“RuntimeLibrary”的不匹配項(xiàng):
值“MT_StaticRelease”不匹配值“MD_DynamicRelease”
列表中的第一個(gè)錯(cuò)誤是靜態(tài)庫(kù)的Release、Debug版本引起的,只需要知道對(duì)應(yīng)的庫(kù)是Release、還是Debug做相應(yīng)的修改就行;
列表中的第二個(gè)錯(cuò)誤是要引用的是靜態(tài)庫(kù),但是配置成動(dòng)態(tài)庫(kù)導(dǎo)致的,只需要修改成”多線程(/Mtd)“就可。
別的報(bào)錯(cuò)還可以參考,或者排列組合都試試
error LNK2038: 檢測(cè)到“RuntimeLibrary”的不匹配項(xiàng)
5. 配置屬性 >> 鏈接器 >> 常規(guī) >> 附加庫(kù)目錄, 添加
這里添加的是protobuf生成的動(dòng)態(tài)庫(kù)的目錄文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-734261.html
D:\ProgramData\protobuf\build\Debug
6. 配置屬性 >> 鏈接器 >> 輸入 >> 附加依賴(lài)項(xiàng), 添加
*d.lib是在Debug模式下生成的庫(kù)文件文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-734261.html
libprotobufd.lib;
libprotocd.lib
3.4 test代碼
#include <iostream>
#include "Persion.pb.h"
using namespace std;
/*
message Persion
{
int32 id = 1; // 編號(hào)從1開(kāi)始
string name = 2;
string sex = 3;
int32 age = 4;
}
*/
int main()
{
// 1. 創(chuàng)建persion對(duì)象, 并初始化
Persion p;
p.set_id(1001);
// 申請(qǐng)一塊內(nèi)存, 存儲(chǔ)名字
p.add_name();
p.set_name(0, "路飛");
p.set_sex("man");
p.set_age(17);
// 2. 將persion對(duì)象序列化 -> 字符串
string output;
p.SerializeToString(&output);
cout << "序列化后的數(shù)據(jù): " << output << endl;
// 3. 數(shù)據(jù)傳輸
// 4. 接收數(shù)據(jù), 解析(output) -> 解碼 -> 原始數(shù)據(jù)
// 4.1 創(chuàng)建Persion對(duì)象
Persion pp;
pp.ParseFromString(output);
// 將Info對(duì)象值取出
// 5. 處理原始數(shù)據(jù) -> 打印數(shù)據(jù)信息
cout << "id: " << pp.id() << ", name: "
<< pp.name(0) << ", "
<< ", sex: " << pp.sex() << ", age: " << pp.age()
<< endl;
return 0;
}
到了這里,關(guān)于Openssl數(shù)據(jù)安全傳輸平臺(tái)003:Protobuf-3.17.2的編譯與部署:Windows:cmake+VS2022/ Centos7/8: make的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!