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
 
 :取消选中该选项
 
- 
         
 
- 
       要做的就是:选择并设置cmake对象,点击
     
   
- 
     第二步:在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
 
 中
 
- 
       假设 protobuf 的安装路径是
- 
     第六步:编译源码并运行
- 右键点击解决方案,然后选择生成
 
     
   
    
    
    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
 
 失败。
 
- 
         成功的电脑:Protobuf 安装在
 
- 
       在 protobuf 安装路径中其实有
- 
手动引入 - 
       如果不能通过
 
 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})
 
版权声明:本文为irving512原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
