文章目录
- 概念和版本
- 嵌入式C/C++如何使用
- 如何制作文件和协议
一、介绍
1.1 介绍
Protocol Buffers(简称为ProtoBuf)是一种用于序列化结构化数据的语言无关、平台无关、可扩展的机制。ProtoBuf是由Google开发的一种数据序列化格式,用于在不同的系统和语言之间进行数据交换。它具有以下特点:
-
语言无关性:ProtoBuf支持多种编程语言,包括C++、Java、Python、Go等,这使得不同语言的应用程序可以使用相同的数据结构进行通信。
-
紧凑性:ProtoBuf使用二进制编码,相比于文本格式(如XML、JSON),它的数据表示更加紧凑,占用更少的存储空间和网络带宽。
-
可扩展性:ProtoBuf的数据结构可以进行版本控制和演化,新的字段可以添加到已有的消息中,而不会破坏已有的解析代码。
-
速度高效:由于数据的紧凑表示和高效的解析算法,ProtoBuf在序列化和反序列化过程中具有较高的性能。
使用ProtoBuf,你可以定义消息的结构和字段类型,并使用相应的编译器将其转换为特定语言的类,以便进行数据的序列化和反序列化操作。这使得在不同的应用程序之间传输和存储结构化数据变得更加简单和可靠。
总体而言,ProtoBuf提供了一种简洁、高效、可扩展的数据序列化机制,适用于跨平台、跨语言的数据交换和存储需求。
协议缓冲区是一种与语言无关、与平台无关的可扩展机制,用于序列化结构化数据。
https://developers.google.cn/protocol-buffers
protobuf的核心内容包括:
- 定义消息:消息的结构体,以message标识。
- 定义接口:接口路径和参数,以service标识。
通过protobuf提供的机制,服务端与服务端之间只需要关注接口方法名(service)和参数(message)即可通信,而不需关注繁琐的链路协议和字段解析,极大降低了服务端的设计开发成本。
1.2 版本
Protobuf(Protocol Buffers)有多个版本,每个版本都有一些不同之处。以下是几个常见的Protobuf版本及其区别:
-
Protobuf v2:这是最早发布的版本,也是最广泛使用的版本。它使用
.proto
文件定义数据结构和消息格式,并提供了一种跨平台、跨语言的数据交换格式。Protobuf v2支持Java、C++、Python等多种编程语言。 -
Protobuf v3:这是最新的Protobuf版本,它在语法和功能上与v2相比有一些变化。主要的改进包括更简洁的语法、更好的默认值支持、更强大的扩展性和更好的错误处理机制。Protobuf v3还引入了一些新的特性,例如Any类型和Map类型。
-
gRPC:gRPC是一个基于Protobuf的高性能RPC(远程过程调用)框架。它使用Protobuf作为其默认的序列化和通信协议,并提供了自动生成的客户端和服务器代码。gRPC支持多种编程语言,并提供了强大的功能,如双向流、流式处理和身份验证。
-
Proto3 JSON Mapping:这是一个附加的Protobuf扩展,允许将Protobuf消息直接转换为JSON格式。它提供了一种方便的方式来在Protobuf和JSON之间进行互操作。
总的来说,不同版本的Protobuf在语法、功能和性能方面会有一些差异。选择适合的版本取决于你的特定需求和项目要求。
二、嵌入式C/C++如何使用
对方提供协议和.proto文件的情况下,我们需要:
- 将.proto文件生成.h和.c代码。
- 将.h和.c代码集成到工程,并按协议调用相关接口。
- 如果我们提供协议:要制定协议和制作.proto文件。
2.1 C++ 使用protobuf
- github源码:https://github.com/protocolbuffers/protobuf
- 注意branches和tag不一样,这里下载branch版本:protobuf-3.20.x
linux x64 编译和使用
./autogen.sh
./configure --prefix=$PWD/install_x64
make -j4
make install
# test (已提前备好.proto文件)
./bin/protoc ./proto-file-test/* --cpp_out=./proto-file-test/
./bin/protoc ./proto-file-test/* --java_out=./proto-file-test
linux arm32 交叉编译和使用
./autogen.sh
./configure -h # 查看帮助手册,需要配置几个环境变量
# 方式一 : 先配置source环境变量
./configure --prefix=$PWD/install_O1 --host=arm-fslc-linux-gnueabi
# 方式二:
./configure --prefix=$PWD/install_O1 --host=arm-linux CC="arm-fslc-linux-gnueabi-gcc -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi" CXX="arm-fslc-linux-gnueabi-g++ -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi" CFLAGS="-g -fPIC" CXXFLAGS="-g -fPIC"
# 编译和安装
make -j4
make install
# 将.proto生成代码可以在x64环境下操作
# 嵌入式工程要用交叉编译的lib库和头文件
libprotobuf.so
libprotoc.so
默认环境变量:
myOpensource/protobuf-3.20.x$ print
print printenv printf printfilterpipelinesvc.exe printticketvalidation.dll printui.exe
print.exe printerbanner printfilterpipelineprxy.dll printmanagement.msc printui.dll
mayue@PC-MAYUE:/mnt/d/hik/myOpensource/protobuf-3.20.x$ printe
printenv printerbanner
mayue@PC-MAYUE:/mnt/d/hik/myOpensource/protobuf-3.20.x$ printenv
SHELL=/bin/bash
WSL_DISTRO_NAME=Ubuntu-20.04
NAME=PC-MAYUE
PWD=/mnt/d/hik/myOpensource/protobuf-3.20.x
LOGNAME=mayue
MOTD_SHOWN=update-motd
HOME=/home/mayue
LANG=C.UTF-8
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
LESSCLOSE=/usr/bin/lesspipe %s %s
TERM=xterm-256color
LESSOPEN=| /usr/bin/lesspipe %s
USER=mayue
DISPLAY=127.0.0.1:0.0
SHLVL=1
WSLENV=
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
PATH=/usr/bin:/home/mayue/.local/bin:/opt/arm-gcc/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin:/opt/fslc-x11/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/bin/arm-fslc-linux-gnueabi:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Users/mayue/AppData/Roaming/MobaXterm/slash/bin:/mnt/c/WINDOWS/:/mnt/c/WINDOWS/system32/:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/Program Files (x86)/VRV/CEMS:/mnt/c/Program Files/爱数 AnyShare Express:/mnt/c/Program Files/nodejs/:/mnt/c/Program Files/TortoiseGit/bin:/mnt/c/Program Files/Git/cmd:/mnt/d/Program Files (x86)/DscConfigTool:/mnt/c/Program Files (x86)/Windows Kits/8.1/Windows Performance Toolkit/:/mnt/c/Program Files/Microsoft SQL Server/110/Tools/Binn/:/mnt/c/Program Files/IDM Computer Solutions/UltraEdit:/mnt/c/Program Files/IDM Computer Solutions/UltraCompare:/mnt/c/Users/mayue/AppData/Local/Programs/Python/Python311:/mnt/c/Strawberry/c/bin:/mnt/c/Strawberry/perl/site/bin:/mnt/c/Strawberry/perl/bin:/mnt/e/Program Files (x86)/NetSarang/Xshell 7/:/mnt/c/Users/mayue/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/mayue/AppData/Roaming/npm:/mnt/c/Users/mayue/AppData/Local/Programs/Microsoft VS Code/bin:/mnt/d/Qt/Qt5.9.0/Tools/mingw530_32/bin:/mnt/c/Users/mayue/AppData/Local/Programs/Python/Python311:/mnt/c/Users/mayue/AppData/Local/Programs/Python/Python311/Scripts:/mnt/c/Users/mayue/AppData/Local/Programs/Python/Python311/Lib/site-packages:/mnt/d/Program Files/JetBrains/PyCharm Community Edition 2022.3.1/bin:/mnt/d/Qt/Qt5.7.1/5.7/msvc2013/bin:/mnt/c/Program Files (x86)/Nmap:/mnt/c/WINDOWS/sysnative/:/snap/bin
HOSTTYPE=x86_64
OLDPWD=/home/mayue
_=/usr/bin/printenv
重新配置环境变量
myOpensource/protobuf-3.20.x$ source /opt/fslc-framebuffer/2.4.4/environment-setup-armv7at2hf-neon-fslc-linux-gnueabi
myOpensource/protobuf-3.20.x$ printenv
SHELL=/bin/bash
M4=m4
WSL_DISTRO_NAME=Ubuntu-20.04
OECORE_SDK_VERSION=2.4.4
PKG_CONFIG_PATH=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi/usr/lib/pkgconfig:/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi/usr/share/pkgconfig
GDB=arm-fslc-linux-gnueabi-gdb
SDKTARGETSYSROOT=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
CPP=arm-fslc-linux-gnueabi-gcc -E -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
TARGET_PREFIX=arm-fslc-linux-gnueabi-
NAME=PC-MAYUE
PWD=/mnt/d/hik/myOpensource/protobuf-3.20.x
LOGNAME=mayue
CXX=arm-fslc-linux-gnueabi-g++ -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
CXXFLAGS= -O2 -pipe -g -feliminate-unused-debug-types
OECORE_NATIVE_SYSROOT=/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux
MOTD_SHOWN=update-motd
LDFLAGS=-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed
HOME=/home/mayue
LANG=C.UTF-8
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.zst=01;31:*.tzst=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.wim=01;31:*.swm=01;31:*.dwm=01;31:*.esd=01;31:*.jpg=01;35:*.jpeg=01;35:*.mjpg=01;35:*.mjpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
KCFLAGS=--sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
OECORE_TARGET_SYSROOT=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
CPPFLAGS=
LD=arm-fslc-linux-gnueabi-ld --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
LESSCLOSE=/usr/bin/lesspipe %s %s
TERM=xterm-256color
LESSOPEN=| /usr/bin/lesspipe %s
USER=mayue
AR=arm-fslc-linux-gnueabi-ar
ARCH=arm
AS=arm-fslc-linux-gnueabi-as
DISPLAY=127.0.0.1:0.0
SHLVL=1
NM=arm-fslc-linux-gnueabi-nm
OECORE_DISTRO_VERSION=2.4
PKG_CONFIG_SYSROOT_DIR=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
OECORE_ACLOCAL_OPTS=-I /opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/share/aclocal
OBJCOPY=arm-fslc-linux-gnueabi-objcopy
WSLENV=
STRIP=arm-fslc-linux-gnueabi-strip
XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
OBJDUMP=arm-fslc-linux-gnueabi-objdump
CONFIG_SITE=/opt/fslc-framebuffer/2.4.4/site-config-armv7at2hf-neon-fslc-linux-gnueabi
PATH=/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/bin:/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/sbin:/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/bin:/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/sbin:/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/bin/../x86_64-fslcsdk-linux/bin:/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/bin/arm-fslc-linux-gnueabi:/opt/fslc-framebuffer/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/bin/arm-fslc-linux-musl:/usr/bin:/home/mayue/.local/bin:/opt/arm-gcc/gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf/bin:/opt/fslc-x11/2.4.4/sysroots/x86_64-fslcsdk-linux/usr/bin/arm-fslc-linux-gnueabi:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Users/mayue/AppData/Roaming/MobaXterm/slash/bin:/mnt/c/WINDOWS/:/mnt/c/WINDOWS/system32/:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/Program Files (x86)/VRV/CEMS:/mnt/c/Program Files/爱数 AnyShare Express:/mnt/c/Program Files/nodejs/:/mnt/c/Program Files/TortoiseGit/bin:/mnt/c/Program Files/Git/cmd:/mnt/d/Program Files (x86)/DscConfigTool:/mnt/c/Program Files (x86)/Windows Kits/8.1/Windows Performance Toolkit/:/mnt/c/Program Files/Microsoft SQL Server/110/Tools/Binn/:/mnt/c/Program Files/IDM Computer Solutions/UltraEdit:/mnt/c/Program Files/IDM Computer Solutions/UltraCompare:/mnt/c/Users/mayue/AppData/Local/Programs/Python/Python311:/mnt/c/Strawberry/c/bin:/mnt/c/Strawberry/perl/site/bin:/mnt/c/Strawberry/perl/bin:/mnt/e/Program Files (x86)/NetSarang/Xshell 7/:/mnt/c/Users/mayue/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/mayue/AppData/Roaming/npm:/mnt/c/Users/mayue/AppData/Local/Programs/Microsoft VS Code/bin:/mnt/d/Qt/Qt5.9.0/Tools/mingw530_32/bin:/mnt/c/Users/mayue/AppData/Local/Programs/Python/Python311:/mnt/c/Users/mayue/AppData/Local/Programs/Python/Python311/Scripts:/mnt/c/Users/mayue/AppData/Local/Programs/Python/Python311/Lib/site-packages:/mnt/d/Program Files/JetBrains/PyCharm Community Edition 2022.3.1/bin:/mnt/d/Qt/Qt5.7.1/5.7/msvc2013/bin:/mnt/c/Program Files (x86)/Nmap:/mnt/c/WINDOWS/sysnative/:/snap/bin
CC=arm-fslc-linux-gnueabi-gcc -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
CFLAGS= -O2 -pipe -g -feliminate-unused-debug-types
CROSS_COMPILE=arm-fslc-linux-gnueabi-
HOSTTYPE=x86_64
CONFIGURE_FLAGS=--target=arm-fslc-linux-gnueabi --host=arm-fslc-linux-gnueabi --build=x86_64-linux --with-libtool-sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi
RANLIB=arm-fslc-linux-gnueabi-ranlib
OLDPWD=/home/mayue
_=/usr/bin/printenv
2.2 C 使用protobuf
谷歌的protobuf支持很多种语言,唯独不支持c,而在嵌入式设备上大都是c语言开发,有很大的需求,
由此出现了很多非官方的支持c语言版ptotobuf。一直在更新的好像就nanopb和protobuf-c。
- protobuf与c语言
- 安装和使用protobuf-c
- 源码:https://github.com/protobuf-c/protobuf-c
- 项目使用版本 protobuf-c-1.3.2,当前测试用最新版本v1.4.1
linux x64 编译
# 依赖上面编译好的protobuf的pkgconfig文件
export PKG_CONFIG_PATH=/mnt/d/hik/myOpensource/protobuf-3.20.x/install_x64/lib/pkgconfig
# 配置生成makefile
./configure --prefix=$PWD/install_x64
# 编译和安装
make -j4 && make install
# 测试(已提前备好.proto文件)
./bin/protoc-c ./proto-file-test/* --c_out=./
linux arm32 编译
# 依赖上面编译好的protobuf的pkgconfig文件
export PKG_CONFIG_PATH=/mnt/d/hik/myOpensource/protobuf-3.20.x/install_O1/lib/pkgconfig
# 注意依赖x64环境下的可执行文件protoc,所以要替换install_O1/bin目录下的protoc文件
# 配置生成makefile
./configure --prefix=$PWD/install_O1 --host=arm-linux CC="arm-fslc-linux-gnueabi-gcc -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi" CXX="arm-fslc-linux-gnueabi-g++ -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/opt/fslc-framebuffer/2.4.4/sysroots/armv7at2hf-neon-fslc-linux-gnueabi" CFLAGS="-g -fPIC" CXXFLAGS="-g -fPIC"
# 编译和安装
make -j4 && make install
# 测试(已提前备好.proto文件)
./bin/protoc-c ./proto-file-test/* --c_out=./
三、语法格式和编辑工具
3.1 语法格式
3.2 编辑工具
内容:编辑、序列化、反序列化、转JSON
- vscode + 插件
- 在线工具
- Protobuf在线解码工具推荐
- protobuf在线反序列化工具
3.3 语法校验
四、参考资料
- 浅谈protobuf
- Protobuf 详解
- Protobuf的简单介绍、使用和分析
- Protobuf入门:在linux下编译使用protobuf
- 深入 ProtoBuf - 编码
- C++使用protobuf实现序列化与反序列化