首页 > 其他分享 >【Protoc】VS2019 (VS平台) 使用 CMake 编译安装、使用 Protobuf 库

【Protoc】VS2019 (VS平台) 使用 CMake 编译安装、使用 Protobuf 库

时间:2023-08-23 15:34:38浏览次数:45  
标签:12 CMake Protobuf proto 编译 Protoc protobuf

背景:工作中需要使用到 protobuf,看了一些教程,感觉都不是很适合,便自己总结一些

开发环境:

  • Win 10
  • VS2019
  • CMake 3.24.2
  • Protobuf 3.21.12 (Protoc 版本必须于 Protobuf 版本一致)

MinGW 版本的编译在之后有空再研究。

https://stackoverflow.com/questions/9243816/how-to-build-googles-protobuf-in-windows-using-mingw

前期工作准备

  • 下载 Protobuf

    Protobuf Github 的 Release下载 \(Protobuf\ cpp\) 版本:

    https://github.com/protocolbuffers/protobuf/releases/tag/v21.12

    (注意,最新的版本可能不包含cpp版本,此处选择了版本3.21.12,如果下载最新all版本,按照以下流程走可能会在CMake configure时因为cmake文件夹中缺少CMakeLists.txt而报错。)

    到上述链接找到Protocol Buffers v21.12,下载名为protobuf-cpp-3.21.12.zip文件解压,将文件夹protobuf-3.21.12移动到 D盘 (盘符根据自己实际情况)。

  • 下载 Protoc 并配置环境变量

    protoc是.proto文件的编译器,它可以将.proto文件生成你想要语言对应的类。如果protoc版本和protobuf版本不一致将会导致错误,因此还是到上述官方Repo下载protoc-21.12-win64.zip:

    https://github.com/protocolbuffers/protobuf/releases/tag/v21.12

    下载完毕后解压将其 bin 目录添加至 Path

    # CMD 验证
    $ protoc --version
    libprotoc 3.21.12
    
  • CMake 下载安装

    本文不涉及,但其操作也很简单,去找到安装包下载即可

    # CMD 验证
    $ cmake --version
    cmake version 3.24.2
    CMake suite maintained and supported by Kitware (kitware.com/cmake).
    

使用 CMake 生成 Probuf 依赖库(Libs)

  • 打开 CMake GUI (如果熟悉 CMake 命令也可自行编译)

    选择 Probuf 项目位置和编译结果存放位置

  • 点击下方的configure,选择Visual Studio的版本2019以及平台 x64,并点击Finish。

    这里请根据每个人的实际情况选择,

    比如 VS2015、VS2017;

    Win32、X64

  • 如果出现Configuration done则表示配置成功(警告可忽略),

  • 然后点击Generate,没有出错的话会出现如下信息:

    Generating done
    

    在上述设置过的输出目录 D:/DevFile/protobuf-3.21.12/build 下会出现 protobuf.sln,使用自己选择的IDE版本打开。

    双击打开它,在Solution Explorer中依次找到

    libprotobuf
    libprotoc
    protoc
    # 并右击 Build
    # Key 此处我们在Debug x64模式下
    # 有需要的请切换成 Release x64
    # 或者自己选定的 win32
    

编译完成以后将在 sln 文件的同级输出目录 Debug 中找到编译成功的 lib 等文件

博主个人将其 CV 到合适的位置

至此,所需的 Protobuf 库就准备好了。


在测试项目中使用 Protobuf

使用 IDE (这里使用 VS2019)中创建一个 C++ 空项目,在其文件夹下新建一个 .proto 文件并命名为 addressbook.proto。 文件内容来自 Google 官网文档:Here

syntax = "proto2";

package tutorial;

message Person {
  optional string name = 1;
  optional int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    PHONE_TYPE_UNSPECIFIED = 0;
    PHONE_TYPE_MOBILE = 1;
    PHONE_TYPE_HOME = 2;
    PHONE_TYPE_WORK = 3;
  }

  message PhoneNumber {
    optional string number = 1;
    optional PhoneType type = 2 [default = PHONE_TYPE_HOME];
  }

  repeated PhoneNumber phones = 4;
}

message AddressBook {
  repeated Person people = 1;
}

编译.proto文件

此处使用 .proto 文件编译器 protoc 编译文件以生成相应的类,可供项目使用(ptotoc的安装以及环境变量配置此处未提及)。

# CMD
cd ${项目文件夹路径PWD}
# 生成addressbook.proto相应的类addressbook.pb.h和addressbook.pb.cc在同一目录下
protoc --cpp_out=./ addressbook.proto
# 注意其中的空格代表同目录下生成
# 指令中cpp表示生成C++类,也可替换成python或者java等

由于 VS2019 并不会自动添加文件,需要自己手动添加生成的 .h 和 .cc 文件

设置项目属性

Key:首先保证自己的IDE环境是和编译环境一致,即使用 Debug 模式下 x64

接下来的属性配置也是如此

打开项目属性管理器,在 Debug | x64 右键编辑属性

  • C/C++ -> 代码生成 -> 运行库:使用 多线程调试 DLL(/MDd)
  • C/C++ -> 预处理器 -> 预处理器定义:新增 _SCL_SECURE_NO_WARNINGS
  • 链接器 -> 常规 -> 附加库目录:新增编译得到 Debug 目录(其中有 Libs 文件),D:\Soft\Language\protobuf-3.21.12\VC142\debug
  • 链接器 -> 输入 -> 附件依赖项:新增 libprotobufd.lib

将 Protobuf 安装目录下的 google 文件夹 D:\DevFile\protobuf-3.21.12\src\google 复制到项目文件夹下

为了区分,我放在了 Google

  • C/C++ -> 常规 -> 附加包含目录:新增 D:\Coding\VS2019\Project2\Project2\Google

至此,点击OK项目属性页面就设置完成了。


编写并运行测试代码

// main.cpp
// 代码来源:https://www.cnblogs.com/windsun/p/12543066.html
#include <iostream>
#include <fstream>
#include "addressbook.pb.h"

using namespace std;

int main(int argc, char** argv) {
	tutorial::Person p1;
	p1.set_id(1);
	p1.set_name("Jerry");
	p1.set_email("[email protected]");

	// serialization
	string resultAfterSerialization;
	p1.SerializeToString(&resultAfterSerialization);
	cout << "after serialization: " << resultAfterSerialization << endl;

	tutorial::Person p2;
	if (!p2.ParseFromString(resultAfterSerialization)) {
		cerr << "failed to parse Person." << endl;
		return -1;
	}
	cout << "after deserialization: " << endl;
	cout << "id: " << p2.id() << endl;
	cout << "name: " << p2.name() << endl;
	cout << "email: " << p2.email() << endl;
}

代码写好以后点击运行即可看到如下输出:

标签:12,CMake,Protobuf,proto,编译,Protoc,protobuf
From: https://www.cnblogs.com/RioTian/p/17651778.html

相关文章

  • cmake入门教程——以LLVM、Pytorch为例
    时代变了,已经基本无人写makefile,现在都是使用cmake进行项目构建的。cmake相对来说还是比较简单的,鄙人熟练修改LLVM/Pytorch,我们可以剖析下我比较熟悉项目的cmake配置。一、cmake介绍二、LLVMcmake配置三、Pytorchcmake配置四、总结......
  • JAVA使用Protobuf GRPC
    IDEA安装Protobuf插件引入maven依赖<dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>3.19.1</version></dependency>protobuf是目前比较新的版本,之前测试过程中使用3.9.1。发现生成的源代码......
  • MinGW-w64、cmake 安装
    介绍MSVC:即MicrosoftVisualC++Compiler,即微软自己的编译器我们下载Windows下的OpenCV时,会带两个文件夹VC14,VC15(分别与VisualStudio的版本有对应关系),这两个文件夹下的库可以直接运行不需要编译将VS作为Qt的开发环境也是使用这个编译器的缘故MinGW:我们都知道GNU在Linux下面......
  • [转]By not providing "FindEigen3.cmake" in CMAKE_MODULE_PATH this project has
    在编译安装的时候出现如下问题,是Eigen3的Cmake依赖问题,已经安装eigen3,但在项目的find_package(Eigen3QUERIED)中,无法找到FindEigen3.Cmake. CMakeErroratloam_velodyne/CMakeLists.txt:13(find_package):Bynotproviding"FindEigen3.cmake"inCMAKE_MODULE_......
  • gcc make cmake ninja的区别
    理清C++编译过程用到的工具概念ref:GCC、CMake、CMakelist、Make、Makefile、Ninja啥关系?一图讲透!-知乎(zhihu.com)早先学C++的时候,因为只需要点击IDE的运行按钮,程序就可以跑起来,写过最复杂的只不过是几个文件的学生管理系统。现在要重新拾起C++,看的项目和之前的不可同日而......
  • 开源十年后 Cap’n Proto 1.0 终发布,比 Protocol Buffers 快太多
    导读Cap'nProto是一种速度极快的数据交换格式和capability-basedRPC系统,于2013年4月开源发布。时至今日,Cap'nProto1.0终于发布,这是一个长期支持版本。Cap'nProto是一种速度极快的数据交换格式和capability-basedRPC系统,于2013年4月开源发布。时至今......
  • 使用protobuf生成各大厂的开放平台接口
    protoc-gen-go_api一款用protobuf文件生成go的http调用代码。具体代码见protoc-gen-go_api安装goinstallgithub.com/dev-openapi/protoc-gen-go_api@latest使用依赖googleapis的http.proto和annotations.proto。并且需要放到google/api/目录下如果google/api是在工程文......
  • Wiindows下更改CMake编译器为MinGW
    个人环境MinGW:使用QT6install的mingw1120_64.CMake:使用QT6install的CMake3.24.2.第一次编译时,默认生成VS的工程文件,为了修改编译器为MinGW,在编译时,键入:cmake-G"MinGWMakefiles"-DCMAKE_CXX_FLAGES=-std=c++11同时也指定了编译器支持的编译标准为c++11注......
  • cmake随笔
    cmakecmake命令使用##配置projectcmake[<options>]<path-to-source>`常用选项:-S<path-to-source>:指定源文件根目录-B<path-to-build>:指定构建文件目录-G<generator-name>:指定生成器。具体支持哪些生成器可用-DCMAKE_BUILD_TYPE=Debug:配置debug版-DCMAKE_BUI......
  • 【已解决】protoc-gen-go: program not found or is not executable Please specify a
    命令(base)➜pbprotoc--go_out=.helloworld.proto报错信息MACm1环境下protoc-gen-go:programnotfoundorisnotexecutablePleasespecifyaprogramusingabsolutepathormakesuretheprogramisavailableinyourPATHsystemvari......