vs2019源码编译protobuf

测试环境:

windows10 x64

vs2019

cmake==3.26.3

protobuf==3.15.0

0. 前言

  • 由于对 Windows 和 VS2019 不太熟悉,在编译并使用 Protobuf 的过程中碰到很多问题,虽然没有完全解决,但勉强能用,这里记录一下。
  • 目标:
    • 使用VS2019编译 Protobuf
    • VS2019 项目中使用编译好的 Protobuf
    • Windows下的 CMake 项目中,引用编译好的 Protobuf

1. VS2019 编译 Protobuf

  • 准备工作:
    • 安装好 cmake
    • 下载好 Protobuf 的源码
  • 第一步:使用打开 cmake-gui 配置 Protobuf,如下图所示
    • 要做的就是:选择并设置cmake对象,点击 configure,然后点击 renerate,生成好后点击 open project
    • 需要配置的参数包括:
      • protobuf_BUILD_SHARED_LIBS:需选中该选项,则可编译动态链接库
      • CMAKE_INSTALL_PREFIX:程序编译完成后安装的路径,默认在C盘,要求VS2019有管理员权限。
      • protobuf_WITH_ZLIB:取消选中该选项

  • 第二步:在VS2019中编译源码
    • 选择下面三个选项,分别右键点击选择生成
    • 最终在 CMAKE_INSTALL_PREFIX 目录下获得对应的 lib/dll 文件以及头文件。
    • 注意:需要将 ${CMAKE_INSTALL_PREFIX}/bin 目录添加到环境变量 PATH 中,这样才能在命令行中使用 protoc 命令。

3. VS2019 项目中使用编译好的 Protobuf

  • 目标:创建一个空项目,引入编译好的 Protobuf 并使用。
  • 第一步:创建一个名为 protobuf_demo 的空项目。
  • 第二步:创建 person.proto,并生成 C++ 原文件。
    • person.proto 如下所示
    • 转换命令为 protoc --cpp_out=./ person.proto,生成了 person.pb.h 和 person.pb.cc
    • 注意:需要在 person.pb.h 中添加 #define PROTOBUF_USE_DLLS,不然编译会报错
syntax = "proto3";
package tutorial;

message Person {
    string name = 1;
    int32 id = 2;
    string email = 3;
}
  • 第三步:编写测试代码
#include "person.pb.h"
#include <iostream>

int main() {
	tutorial::Person person;
	person.set_id(1);
	person.set_email("john@gmail.com");
	person.set_name("John");

	std::cout << person.SerializePartialAsString() << std::endl;;
	return 0;
}
  • 第四步:VS2019 相关设置 - 添加源码到解决方案

  • 第五步:设置 protobuf 相关 VS2019 设置
    • 假设 protobuf 的安装路径是 C:\Program Files (x86)\protobuf
    • 项目 -> 属性 -> VC++目录 - > 包含目录:设置头文件路径为 C:\Program Files (x86)\protobuf\include
    • 项目 -> 属性 -> VC++目录 -> 库目录:设置lib文件路径 C:\Program Files (x86)\protobuf\lib
    • 项目 -> 链接器 -> 输入 -> 附加依赖项 中添加 libprotobufd.lib
    • 将 C:\Program Files (x86)\protobuf\bin 添加到系统路径 PATH 中
  • 第六步:编译源码并运行
    • 右键点击解决方案,然后选择生成

4. VS2019 的 CMake 项目中引入 Protobuf

  • 源码以及proto文件生成请参考第三章

    • 注意,需要在 *.ph.h 最前面添加 #define PROTOBUF_USE_DLLS
  • 一般引入(即通过 find_package 引入)

    • 在 protobuf 安装路径中其实有 cmake 配置文件
    • Linux 中成功通过 find_package(Protobuf) 以及 Protobuf_INCLUDE_DIRS 和 Porotuf_LIBRARIES 引入头文件和库文件。
    • 本人在两台电脑上做了类似的操作,一台电脑成功了,一台失败了。
      • 成功的电脑:Protobuf 安装在 C:\Program Files (x86)\protobuf 中,find_package 以及各种参数都能正常使用。
      • 失败的电脑:Protobuf 安装在源码路径下,find_package 失败。
  • 手动引入

    • 如果不能通过 find_package 引入 Protobuf,就需要手动将 protobuf 的头文件路径、链接文件路径等手动引入 CMakeLists.txt 中。
    • 换句话说,需要手动设置 Protobuf_INCLUDE_DIRS 和 Protobuf_LIBRARIES 两个参数。
    • 假设Protobuf的安装路径是 D:/vs/protobuf-3.20.1/vs_x64_out,那么CMakeLists.txt 文件形式可以参考下面

# 一般引入方法(二选一)
find_package(Protobuf)

# 手动引入方法(二选一)
SET(Protobuf_INSTALL_DIR D:/vs/protobuf-3.20.1/vs_x64_out)
include_directories("${Protobuf_INSTALL_DIR}/include")
link_directories("${Protobuf_INSTALL_DIR}/lib")
SET(Protobuf_LIBRARIES libprotobufd libprotocd)

# 公用代码
include_directories(${Protobuf_INCLUDE_DIRS})
add_executable (protoc_demo protoc_demo.cpp person.pb.cc)
target_link_libraries(protoc_demo ${Protobuf_LIBRARIES})

  • 22
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要进行交叉编译protobuf,您需要以下步骤: 1. 确定目标平台的架构和操作系统,例如 ARM 架构的 Linux 系统。 2. 安装交叉编译工具链,该工具链包括交叉编译器和库文件。这些工具可用于在开发机上编译目标平台的代码。具体的安装方法因不同的平台而异。 3. 下载protobuf源代码,您可以从GitHub上下载最新版本的protobuf源代码。解压后进入protobuf源代码目录。 4. 配置protobuf源代码的编译选项。运行如下命令: ``` ./configure --host=target --with-sysroot=path/to/sysroot ``` 其中,`--host` 参数指定目标平台的架构和操作系统,`--with-sysroot` 参数指定交叉编译器的 sysroot 路径。 5. 运行 make 命令来编译protobuf。如果一切正常,make 命令将生成一个可执行文件,名为 `protoc`,它是 protobuf编译器。 ``` make ``` 6. 运行 make install 命令来安装protobuf。 ``` make install ``` 完成上述步骤后,您就可以在目标平台上使用 protobuf 了。 ### 回答2: 交叉编译是指在一台机器上编译适用于另一种体系结构的软件。若要进行protobuf的交叉编译,可以按照以下步骤进行操作: 1. 准备交叉编译工具链:首先需要安装适用于目标体系结构的交叉编译工具链,可以通过搜索引擎获取相关的工具链安装方式。 2. 下载与安装protobuf源码:从protobuf的官方GitHub仓库下载最新的源码,并解压缩到本地文件夹。 3. 配置交叉编译环境变量:进入protobuf源码文件夹,在命令行中设置交叉编译的环境变量,以便正确地使用交叉编译工具链。 4. 配置编译参数:使用文本编辑器打开源码文件夹中的根目录下的`configure`文件,并修改其中的编译参数。根据目标体系结构的不同,可以根据需要进行添加、修改或删除一些参数。 5. 运行配置脚本:在命令行中运行`./configure`命令,开始配置protobuf编译环境。 6. 编译protobuf:运行`make`命令开始编译protobuf编译过程可能需要一些时间,请耐心等待完成。 7. 交叉编译结果获取:编译完成后,在源码文件夹中可以找到编译好的protobuf二进制文件。将这些文件拷贝到目标体系结构所在的机器中。 以上是一个简单的protobuf交叉编译的过程。具体的操作步骤可能因不同的体系结构而有所差异,可以根据实际需要进行相应的修改和调整。 ### 回答3: 交叉编译protobuf可以按照以下步骤进行: 1. 首先,确保在本地机器上安装了protoc编译器和protobuf库。如果没有,可以从官方网站下载并按照官方文档进行安装。 2. 创建一个交叉编译工具链。根据目标平台的不同,选择合适的交叉编译工具链来编译protobuf。这通常包括交叉编译器、库文件和头文件,可以从目标平台的官方网站或其他来源获取。 3. 下载protobuf源码,并解压到本地。 4. 进入protobuf源码目录,并使用交叉编译工具链的前缀指定编译器和链接器,执行以下命令进行配置: ``` $ ./configure --host=目标平台-triplet --with-protoc=protoc路径 ``` 注意将目标平台-triplet替换为交叉编译工具链的前缀,将protoc路径替换为本地机器上protoc的路径。 5. 执行make命令进行编译。这将使用交叉编译工具链来编译protobuf,并生成目标平台的可执行文件和库文件。 6. 编译完成后,可以将生成的可执行文件和库文件拷贝到目标平台上进行部署和使用。 总结:交叉编译protobuf需要创建交叉编译工具链,并使用该工具链对protobuf源码进行配置和编译。通过这种方式,可以从一台机器上编译生成在另一台机器上运行的可执行文件和库文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FL1623863129

你的打赏是我写文章最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值