市面上大多博客没介绍如何组建多目录,多proto的项目经验,如果本博客经验如果能帮到你,那真是太好了

本次代码生成C++代码,测试用例采用gtest进行搭建,工程目录如下:


hobby.proto 位于protocol/hobby下,内容入下:

syntax = "proto3";enum Hobby {kGame = 0;kSwim = 1;kFootball = 2;kBasketball = 3;kTableTennis = 4;kImAWaste = 5;
}

我在basic_data.proto中以public的形式导入hobby.proto,basic_data.proto 位于protocol/basic_data下,内容入下:

syntax = "proto3";// 把包名去掉等于本proto内为全局命名空间  把包名加上则为basic_data命名空间
package basic_data;import public "hobby/hobby.proto";
// import "google/protobuf/any.proto";message student
{message individual_info{string address = 1;string birthday = 2;bool is_male = 3;}int32 index = 1;individual_info info = 2;string name = 3;
}message student_list
{repeated student students = 1;
}

在shell脚本中进行代码生成,脚本如下:

#!/bin/bashPROTOCOL_PATH=./protocoldeclare -a PROTOCOL_ARRAY=(hobby basic_data)for i in ${PROTOCOL_ARRAY[@]}
do
:
# --cpp_out基于PROTOCOL_PATH,再相对于--proto_path下的文件目录创建产物的路径
# 如: 产物hobby.pb.*的路径为: ./protocol + booby/ ===> ./protocol/boobyprotoc --cpp_out=${PROTOCOL_PATH} ${i}/${i}.proto --proto_path=${PROTOCOL_PATH}
done

执行后,生成的.h 和 .cc出现在下图所示位子:

然后我的测试代码如下:

#include <fcntl.h>
#include <gtest/gtest.h>
#include <unistd.h>#include <algorithm>
#include <iostream>
#include <string>#include "protocol/basic_data/basic_data.pb.h"TEST(serialize_and_parse_unittest, TEST1) {using namespace basic_data;student liming{};liming.set_name("liming");liming.set_index(1);if (auto liming_individual_info = liming.mutable_info();liming_individual_info) {liming_individual_info->set_address("china");liming_individual_info->set_birthday("29/2/1996");liming_individual_info->set_is_male(true);}student xiaohong{};xiaohong.set_name("xiaohong");xiaohong.set_index(2);if (auto xiaohong_individual_info = xiaohong.mutable_info();xiaohong_individual_info) {xiaohong_individual_info->set_address("china");xiaohong_individual_info->set_birthday("28/2/1996");xiaohong_individual_info->set_is_male(false);}// student_liststudent_list class_members{};class_members.add_students()->CopyFrom(liming);class_members.add_students()->CopyFrom(xiaohong);// serializeif (int fd = open("mark.txt", O_WRONLY | O_CREAT, 0755); fd > 0) {class_members.SerializePartialToFileDescriptor(fd);close(fd);}// parseif (int fd = open("mark.txt", O_RDONLY, 0755); fd > 0) {class_members.Clear();class_members.ParseFromFileDescriptor(fd);close(fd);for (auto &&member : class_members.students()) {if (member.has_info()) {std::cout << "name:" << member.name() << "- :" << member.index()<< "\n";auto &&info = member.info();std::cout << "address:" << info.address() << "\n";std::cout << "birthday:" << info.birthday() << "\n";std::cout << "is_male:" << info.is_male() << "\n";}}}
}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.6)set(CMAKE_BUILD_TYPE "Debug")project(protobuf_testLANGUAGES C CXX
)set(PREFIX_THIS_PROJECT ..)
set(PROTOCOL_PATH ${PREFIX_THIS_PROJECT}/protocol)
file(GLOB_RECURSE PROTOCOL_CC ${PROTOCOL_PATH}/*.cc)find_package(GTest REQUIRED)
find_package(Protobuf REQUIRED)
include_directories(${Protobuf_INCLUDE_DIRS})
include_directories(${PREFIX_THIS_PROJECT})
include_directories(${PROTOCOL_PATH})enable_testing()set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -fPIC -pipe -std=c++17 -fno-exceptions")set(TEST_LISTserialize_and_parse_unittest
)foreach(src ${TEST_LIST})add_executable(${src} ${src}.cc ${PROTOCOL_CC})target_link_libraries(${src} ${Protobuf_LIBRARIES} GTest::GTest GTest::Main)add_test(${src} ${src})
endforeach()

protobuf3 import的使用和多proto代码生成和cmake中引用protobuf相关推荐

  1. java的import和python的import对比_Java中的Import和Pacakge作用生动详解(感觉python中的import作用差不多)...

    转自:http://apps.hi.baidu.com/share/detail/6510541 有些人写了一阵子Java,可是对於Java的package跟import还是不太了解很多人以為原始码. ...

  2. Cocos Creator TypeScript 中使用ProtoBuf(利用工具把proto文件生成对应的js文件以及ts文件)

    我是一枚刚入坑cocos的小白o(╯□╰)o 开发环境:Cocos Creator 1.9   (需要安装Node.js,使用npm命令) 在网上找了很久都是讲的protobuf.js的用法,但是没有 ...

  3. python中import random可以省略吗_import random函数 python中random什么意思

    python中random.randint(1,100)随机数中包不包括1在python中的random.randint(a,b)用于生成一个指定范围内的整数.其中参数a是下限,参数b是上限. imp ...

  4. 代码生成工具CodeSmith中SchemaExplorer类API文档[转]

    SchemaExplorer中主要类的结构和功能: DatabaseSchema 属性: ConnectionString:一般填写类似于ADO.NET的连接字符串 Name:数据库名称 Provid ...

  5. 梯形图 c语言代码生成,PLC梯形图中内嵌C语言编程的实现

    针对现有梯形图语言适合实现逻辑控制而不适合实现复杂算法这一问题,从基于构件技术的梯形图实现原理出发,对构件的属性定义以及编译方法进行了分析,提出了一种PLC梯形图内嵌C语言实现混合编程的方法,并在CA ...

  6. Vue中import与@import的区别及使用场景

    import script中的import是js的语法, 是在js中去引用css文件 (ES6)模块化规范:默认导入语法 import 接收名称 from '模块标识符' 使用 导入组件 import ...

  7. python中使用 protocol buffer(Protobuf)

    项目中引入proto的依赖 [两种方法]: 方法1. 官网下载对应的语言包,https://github.com/protocolbuffers/protobuf/releases 这里选择pytho ...

  8. [yishen] 小慕读书web端学习笔记

    课程常用链接 [前奏-课程]快速入门Web阅读器开发 [小慕读书web端]Vue 实战商业级读书Web APP 全面提升技能 [epub图书免费下载站点 · 中文书]http://www.ziliao ...

  9. python-django-03-django-ORM入门

    ORM简介 ORM即Object Relational Mapping,全称对象关系映射. 当我们需要对数据库进行操作时,势必需要通过连接数据.调用sql语句.执行sql语句等操作,ORM将数据库中的 ...

最新文章

  1. Python案例:使用正则表达式的爬虫
  2. [POJ3630] Phone List
  3. Benny:只处理那些NVARCHAR字段,并且NTEXT也是小于4000个字符时的情况.不管类型.只管长度....
  4. Cisco 综合交换实验Dynamips.Net实现方法
  5. JavaFX鼠标滚动放大缩小图片
  6. Bootstrap modal使用及点击外部不消失的解决方法
  7. 6.Composer实现PHP中类的自动加载
  8. PMBOK第6版 项目管理过程组与知识领域(15至尊图)
  9. 手机刷机后丢失照片恢复怎么做到?
  10. 转载maven版本更新
  11. 高等数学 武忠祥强化班
  12. 毕业一年经历两次大裁员......
  13. TabTransformer:用于表格数据的Transformer
  14. oppo手机设置wifi代理和charles证书
  15. 小米公司不管老用户的手机了。小米1
  16. verilog中always和initial的区别
  17. 大前端时代的乱流:带你了解最全面的 Flutter Web
  18. 学无止境——给网友的公开信
  19. Mac 错误提示:zsh: command not found: brew解决方法
  20. flv文件元信息(metadata)

热门文章

  1. Activity那些不为人知的秘密
  2. 文案策划没思路?来看老前辈经验分享
  3. 大学计算机基础实验教程课后答案,大学计算机基础与实验教程习题答案.doc
  4. 当你只有一个主意时,这个主意就太危险了!
  5. 我绑定了手机,怎么没有赠送的下载积分呀
  6. Nowcoder 筑巢
  7. smartgit 破解
  8. 推挽输出和开漏输出的区别
  9. 语文前五册词类活用整理
  10. 华为28条铁规,值得学习