protobuf的编译和使用,在windows平台上

本文详细介绍如何使用Protobuf进行数据序列化,包括下载安装、编译Protocol Buffer文件、生成C++代码及测试验证等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0 准备工作:

(1)下载protobuf
https://github.com/google/protobuf/releases
这里写图片描述
下载的是cpp版本,选择当前最新版本即可
(2)安装cmake
https://cmake.org/download/
这里写图片描述
根据系统选择安装的cmake版本,我这里选择的是64位版本安装。

1 编译protocol

解压刚才下载的protobuf包,打开cmake
这里写图片描述
按图所示,1选择protobuf中的cmake目录,2是选择目标目录(生成的工程存放位置),3的点击左下角的configure按钮:
这里写图片描述
以vs2015工程为例,上面的一个框是32位版本,下面的Win64是64位版本。以生成32位版本为例,生成64位版本工程操作相同。
这里写图片描述
点击finish
这里写图片描述
没有错误,generate按钮变为可用,默认的选项如图,这里就默认生成静态包。
点击generate按钮后,几秒后,Open Project按钮变为可用,打开工程
这里写图片描述
这里可以选择生成Debug版本32位的lib,只生成libprotobuf和protoc即可。
这里写图片描述
这3个是我们需要的。

3 测试生成的lib库和protoc.exe工具

(1)新建一个person.proto的文本文件

package tutorial;

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

tutorial是包名(也可以说是命名空间),没有第一行的话,就是没有命令空间的。
将protoc.exe和person.proto放在同一个文件夹下,再添加一个批处理文件build.bat,内容为:

protoc --cpp_out=./ person.proto

双击批处理文件build.bat,会在当前目录下生成:person.pb.h和person.pb.cc文件,将其添加到下面的vs工程中。
(2)建立一个win32控制台程序的工程
把protobuf-3.6.1\src\google\protobuf这个目录中的头文件(其余的文件可以删除,也可以保留,不影响),都拷贝过来,放在当前工程下,建立一个include文件夹,把这些.h头文件放进去(文件夹名自己定)。
生成的libprotobufd.lib也拷贝过来,放在当前目录下的lib文件夹(自己新建的文件夹)中。
设置工程:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
main.cpp代码:

#include <iostream>
#include <fstream>
#include <string>
#include "person.pb.h"

using namespace std;

int main(int argc, char* argv[])
{
	GOOGLE_PROTOBUF_VERIFY_VERSION;

	tutorial::Person person;

	//将数据写到person.pb文件
	person.set_id(123456);
	person.set_name("Mark");
	person.set_email("mark@example.com");

	fstream out("person.pb", ios::out | ios::binary | ios::trunc);
	person.SerializeToOstream(&out);
	out.close();


	//从person.pb文件读取数据
	fstream in("person.pb", ios::in | ios::binary);
	if (!person.ParseFromIstream(&in)) {
		cerr << "Failed to parse person.pb." << endl;
		exit(1);
	}

	cout << "ID: " << person.id() << endl;
	cout << "name: " << person.name() << endl;
	if (person.has_email()) {
		cout << "e-mail: " << person.email() << endl;
	}

	getchar();
	return 0;
}

这两个生成的文件要记得添加到工程中
这里写图片描述
编译过程:

1>------ 已启动全部重新生成: 项目: pbDemo, 配置: Debug Win32 ------
1>  person.pb.cc
1>  main.cpp
1>  正在生成代码...
1>  pbDemo.vcxproj -> D:\VS2015_Project\pbDemo\Debug\pbDemo.exe
1>  pbDemo.vcxproj -> D:\VS2015_Project\pbDemo\Debug\pbDemo.pdb (Full PDB)
========== 全部重新生成: 成功 1 个,失败 0 个,跳过 0 个 ==========

运行结果:
这里写图片描述
参考:
https://blog.youkuaiyun.com/program_anywhere/article/details/77365876
https://blog.youkuaiyun.com/lifeng_math/article/details/51993698
https://blog.youkuaiyun.com/qing666888/article/details/79137963
VS2013编译错误:-D_SCL_SECURE_NO_WARNINGS解决方案:
https://blog.youkuaiyun.com/Apollon_krj/article/details/68923683
warning LNK4099: PDB 原因及解决方案:
http://www.cnblogs.com/fqucuo/p/4887083.html

<think>好的,我现在需要帮用户解决如何使用CMake编译Protobuf的问题。首先,我得回忆一下之前看到的引用内容,尤其是引用34,里面提到了FindProtobuf.cmake模块protobuf_generate_cpp函数。用户可能需要一个步骤清晰的指南,所以应该分步骤说明。 首先,用户可能已经安装了Protobuf,但需要确认环境是否准备好。根据引用2,环境准备是第一步,所以应该提醒安装protobuf编译开发库,比如在Ubuntu上用sudo apt-get安装。 接下来,项目结构方面,用户可能需要组织proto文件源代码。例如,proto文件放在proto目录下,C++代码放在src目录,这样结构清晰。引用3中的例子提到了pb/t.proto,所以可能需要类似的目录结构。 然后,编写CMakeLists.txt是关键。需要包含find_package(Protobuf REQUIRED),然后使用protobuf_generate_cpp来生成代码。这里要注意不同版本的CMake可能语法不同,比如引用3中的protobuf_generate_cpp的参数可能需要调整,特别是proto文件的路径是否正确。 另外,引用4提到如果proto文件较多或者结构复杂,可能需要更复杂的方法,比如使用file(GLOB_RECURSE)来收集所有proto文件,或者用add_subdirectory来处理嵌套的目录。用户的问题可能属于基础情况,所以先给出简单示例,再提到复杂情况的处理。 生成源代码后,需要将生成的文件添加到可执行文件或库中,并链接Protobuf库。引用3中的例子展示了如何用add_executabletarget_link_libraries,这部分需要详细说明。 可能还需要处理头文件包含路径,确保生成的pb.h文件能被正确找到。比如设置include_directories(${Protobuf_INCLUDE_DIRS})或者使用target_include_directories。 用户可能遇到的常见问题包括proto文件路径不正确,导致生成失败;或者没有正确链接Protobuf库,导致链接错误。需要提醒用户检查路径链接设置。 最后,根据用户提供的引用,特别是引用4中的项目地址,可以推荐用户参考实际项目,比如github上的示例,这样更直观。 总结一下,步骤应该是:环境准备、项目结构、编写CMakeLists、生成代码、包含头文件、编译运行。同时,给出优化建议常见问题解决方法,帮助用户更全面地理解。</think>### 分步指南:使用CMake编译Protobuf示例 #### 1. 环境准备 - 安装protobuf编译器`protoc`开发库 - Ubuntu/Debian: `sudo apt-get install protobuf-compiler libprotobuf-dev` - MacOS: `brew install protobuf` - 验证版本: `protoc --version` (建议3.0+版本) #### 2. 项目结构 ``` project/ ├── CMakeLists.txt ├── proto/ # 存放.proto文件 │ └── addressbook.proto └── src/ └── main.cpp # 使用生成的pb代码 ``` #### 3. 编写CMakeLists.txt ```cmake cmake_minimum_required(VERSION 3.12) project(protobuf_example) # 查找Protobuf包 find_package(Protobuf REQUIRED) # 生成C++代码 get_filename_component(PROTO_DIR "proto" ABSOLUTE) file(GLOB PROTO_FILES "${PROTO_DIR}/*.proto") protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROTO_FILES}) # 设置生成文件输出目录 set_source_files_properties(${PROTO_SRCS} ${PROTO_HDRS} PROPERTIES GENERATED TRUE ) # 创建可执行文件 add_executable(${PROJECT_NAME} src/main.cpp ${PROTO_SRCS} # 添加生成的源码 ) # 链接库包含路径 target_link_libraries(${PROJECT_NAME} PRIVATE protobuf::libprotobuf ) target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_BINARY_DIR} # 包含生成的pb.h文件 ) ``` #### 4. 示例proto文件 (addressbook.proto) ```protobuf syntax = "proto3"; package tutorial; message Person { string name = 1; int32 id = 2; string email = 3; } ``` #### 5. 编译运行 ```bash mkdir build && cd build cmake .. make ./protobuf_example ``` ### 优化建议 1. **分层目录处理**:使用`file(GLOB_RECURSE)`处理多级proto目录[^4] 2. **生成位置控制**:通过`--proto_path`指定proto文件搜索路径 3. **跨平台支持**:添加`if(WIN32)`条件处理Windows的lib路径[^5] ### 常见问题解决 - **找不到proto文件**:检查`protobuf_generate_cpp`中的路径是否使用绝对路径 - **链接错误**:确认`target_link_libraries`链接的是`protobuf::libprotobuf` - **头文件缺失**:验证`CMAKE_CURRENT_BINARY_DIR`是否包含生成的pb.h文件 实际应用可参考开源项目[transmit_asio](https://github.com/mingjitianming/transmit_asio)的CMake集成方案[^4]。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值