flatbuffer源码编译和使用方法

news/2025/7/9 5:50:28/

系统: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,验证结果。

以上

原创,转载请注明出处。


http://www.ppmy.cn/news/1739762.html

相关文章

python程序设计(2)

下周三要考python&#xff0c;我还是害怕我python挂了&#xff0c;于是python&#xff08;2&#xff09;来了。期末周呵呵。。。 1.编写程序&#xff0c;求3个整数中的中间数。定义和调用函数def mid(a,b,c),返回a,b,c三数中大小位于中间的一个数。 运行示例&#xff1a; 请…

无人机避障——感知篇(Orin nx采用zed2双目相机进行Vins-Fusion定位,再通过位姿和深度图建图完成实时感知)

通过ZED2双目视觉相机进行Vins FusionSLAM定位之后&#xff0c;需要获取其中的信息完成无人机的实时感知部分&#xff0c;感知需要的是栅格地图话题&#xff0c;因为EGO-planner高飞老师就是通过Vins Fusion做感知的部分&#xff0c;所以其中可以借鉴一下建图方法。 通过ZED2双…

网络的那些事——初级——路由策略

什么是路由策略&#xff1f; 路由策略主要实现了路由过滤和路由属性设置等功能&#xff0c;它通过改变路由属性&#xff08;包括可达性&#xff09;来改变网络流量所经过的路径。 路由协议在发布、接收和引入路由信息时&#xff0c;根据实际组网需求实施一些策略&#xff0c;…

疏锦行Python打卡 DAY 27 函数专题2:装饰器

def logger(func):def wrapper(*args, **kwargs):print(f"开始执行函数 {func.__name__}&#xff0c;参数: {args}, {kwargs}")result func(*args, **kwargs)print(f"函数 {func.__name__} 执行完毕&#xff0c;返回值: {result}")return resultreturn wr…

中天互联的 MES 系统的功能和优势有哪些

中天互联的 MES 系统是基于爱尚工业互联网平台开发的生产信息化管理系统&#xff0c;具有制造数据管理、计划排程管理等功能&#xff0c;具备数据集成度高、精准追溯等优势。具体如下&#xff1a; 功能1&#xff1a; 制造数据管理&#xff1a;对生产相关数据进行统一管理&#…

WSGI(自用)

WSGI WSGI&#xff08;Web Server Gateway Interface&#xff09;是Python语言中定义的Web服务器与Web应用程序或框架之间的一种通用接口标准。它通过一套规范化的通信协议&#xff0c;使Web服务器和Python应用程序能够解耦&#xff0c;从而提高开发效率和部署灵活性。以下从定…

Hugo 自动化部署实战-部署 Hugo 到 Netlify

本文将详细指导你如何设置 GitHub Actions&#xff0c;以实现 Hugo 静态网站的自动化构建&#xff0c;并将其部署到 Netlify。我们将采用一种安全且易于管理的方式&#xff0c;通过一个集中的、以 JSON 格式存储的 GitHub Secret 来管理 Netlify 的部署凭据。 概述&#xff1a…

Vue首屏加载速度优化方案

优化 Vue 首屏加载速度是提升用户体验的关键&#xff0c;以下是详细的优化方案&#xff0c;分为多个方向&#xff1a; 一、代码分割与懒加载 路由懒加载 使用动态导入语法拆分路由组件&#xff0c;减少首屏加载的代码量&#xff1a; const Home () > import(./views/Ho…