当前位置: 首页 > news >正文

flatbuffer源码编译和使用方法

系统:ubuntu 22.04

flatbuffer版本:1.12.1

(免积分下载https://download.csdn.net/download/gz9456/90982223?spm=1001.2014.3001.5503)

flatbuffer特点和优势:

高性能,零拷贝,序列化后的数据体积小,序列化速度极快;

flatbuffer源码编译方法:

依赖:g++, cmake, make

1.将源码下载 解压flatbuffers-1.12.1。

2.在flatbuffers-1.12.1文件夹中创建build和install目录。

3.cd 到build目录,输入指令cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=../install -DCMAKE_CXX_FLAGS="-Wno-class-memaccess" -DFLATBUFFERS_BUILD_SHAREDLIB=ON ..

指令解析:构建release版本,指定安装目录是相对当前目录的上一级目录里的install,构建动态库。 -DCMAKE_CXX_FLAGS="-Wno-class-memaccess"这句是防止编译报错:/arrays_test_generated.h:156:16: error: ‘void* memset(void*, int, size_t)’ clearing an object of non-trivial type ‘struct MyGame::Example::NestedStruct’; use assignment or value-initialization instead [-Werror=class-memaccess]
  156 |     std::memset(d_, 0, sizeof(d_));
      |     ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~

4.make

5.make install

编译完成,install文件夹中生成对应的库、头文件和flatc.

flatc的使用方法:

flatc是flatbuffers的官方编译器,主要作用是将.fbs文件编译成指定语言的源代码,验证二进制文件是否与.fbs 匹配。 flatbuffer跟json相互转换。反序列化,将二进制转为可读的json。

详细用法:

1.编译.fbs为C++代码:

./flatc --cpp test.fbs  会生成头文件

2.将json转为flatbuffer二进制

flatc --binary test.fbs test.json    会生成test.bin

3.将flatbuffer二进制转为json

./flatc -t --raw-binary test.fbs -- test.bin

4.校验json是否符合.fbs格式,并生成二进制

./flatc --strict-json --binary test.fbs test.json

附:test.fbs和test.json内容

test.fbs

table Person {
  id:int;
  name:string;
}

root_type Person;

 test.json

{
  id: 5,
  name: "zhang"
}

flatbuffer在C++ 中的使用方法:

创建main.cpp,将install里面的flatbuffers文件夹拷贝过来。

#include <iostream>
#include <fstream>
#include <vector>
#include "test_generated.h" //此文件是用flatc生成的

int main() {
  // 读取二进制文件到 buffer
  std::ifstream infile("test.bin", std::ios::binary);
  if (!infile) {
    std::cerr << "Failed to open test.bin\n";
    return 1;
  }

  std::vector<char> buffer((std::istreambuf_iterator<char>(infile)),
                           std::istreambuf_iterator<char>());

  // 通过 generated 的函数读取数据
  auto person = GetPerson(buffer.data());

  std::cout << "ID: " << person->id() << "\n";
  std::cout << "Name: " << person->name()->str() << "\n";

  return 0;
}

编译g++ main.cpp -std=c++11 -I./

执行a.out,验证结果。

以上

原创,转载请注明出处。

相关文章:

  • 短剧小程序开发:开启碎片化娱乐新视界
  • SpringCloud微服务:服务保护和分布式事务
  • 三次握手建立连接,四次挥手释放连接——TCP协议的核心机制
  • Linux 下的 PM2 完整指南
  • linux基于内存实现jar文件搜索
  • 如何有效监控JVM环境,保障应用性能
  • Elasticsearch:使用 ES|QL 进行地理空间距离搜索
  • 动态规划3——背包类动态规划详解
  • elasticSearch是什么,如何使用,有什么用
  • 考研系列—408真题操作系统篇(2015-2019)
  • Windows环境变量原理(用户变量与系统变量)(用户环境变量、系统环境变量)
  • centos6.5 老旧系统编译glib-2.58.3.tar.bz2
  • vue-property-decorator实践(一)
  • 如何通过插件系统打造个性化效率工作流
  • AUTOSAR图解==>AUTOSAR_TR_InteroperabilityOfAutosarTools
  • PEP 8: E302 expected 2 blank lines, found 0
  • [vela os_5] 中断系统 | 任务调度 | 日志系统
  • node.js连接mysql写接口(一)
  • jupyter notebook的相关知识及可能遇到的问题
  • spring-ai MCP Server运行一段时间后断联2
  • 网页编程培训学校/seo优化一般多少钱
  • 八大美院视觉传达设计作品/seo服务外包报价
  • 北京模板网站建站/广告公司推广文案
  • 广东网站设计流程/百度推广公司怎么代理到的
  • 没有网站也可以做外贸吗/制作网站大概多少钱
  • wordpress fb主题/临沂seo优化