Protobuf C/C++实战笔记(1)
前言:
Protobuf作为数据交换格式, 被很多人喜欢. 数据压缩比高, 向后兼容性强, 性能优异, 而且对平台中性, 支持多语言(C/C++, JAVA, Python). 优点太多, 实在不胜枚举(居家旅行, 杀人放火必备良药, oh yeah! ^_^).
本篇文章着重记录Linux下对C/C++版Protobuf的编译/链接和API使用.
Protobuf下载和安装
让我们使用protobuf 2.4.1作为样例来展示.
社区url: http://code.google.com/p/protobuf/
下载链接: http://protobuf.googlecode.com/files/protobuf-2.4.1.tar.gz
以下是相关的命令和操作
1). 下载和解压
wget http://protobuf.googlecode.com/files/protobuf-2.4.1.tar.gz
tar -jxvf protobuf-2.4.1.tar.gz
2). 编译和安装
./configure --disable-shared --prefix=/path/to
make && make install
3). 目录结构
tree -L 2 # 两层的目录结构(bin/inculde/lib), 如下所示:
评注: bin/protoc 是pb生成工具, include, lib则是对应的头文件和相应的静态/动态库
实战演示
让我们来编辑一下msg.proto文件
1 2 3 | message msg_t { required int32 id = 1; } |
评注: 简单定义了msg_t类
借助protoc来生成相应语言版本的序列/反序列代码
1 | protoc --cpp_out=./ msg.proto |
评注: --cpp_out指定了c/c++版本代码的输出路径
最终生成 msg.pb.cc msg.pb.h 两文件
编写如下测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include "msg.pb.h" #include <stdio.h> #include <assert.h> int main() { char buf[1024] = { '\0' }; int buf_len = 0; msg_t msg1; msg1.set_id(1001); // *) serialize phrase => object to byte array msg1.SerializeToArray(buf, sizeof (buf)); buf_len = msg1.ByteSize(); msg_t msg2; // *) deserialize phrase => byte array to object msg2.ParseFromArray(buf, buf_len); assert (msg1.id() == msg2.id()); return 0; } |
进行编译并运行
g++ -o app app.cpp msg.pb.cc -I/path/to/protobuf/include -L/path/to/protobuf/lib -lprotobuf -lpthread
./app
评注: /path/to为具体protobuf的安装目录
链接方式
静态链接还是动态链接? 这是个问题!
在指定的protobuf库路径中, 如果存在动态连接库, 则编译的程序优先选择动态链接, 否则则采用静态链接的方式.
让我们用图来对比说明
动态链接方式
在protobuf的lib目录中, 若存在动态连接库(so文件)
则编译后的app可执行程序
使用ldd app分析, 存在如下依赖项
评注: 红线区域标明了引用了动态连接库libprotobuf.so.7
直接执行二进制app文件, 遇到如下错误
1 | ./app: error while loading shared libraries: libprotobuf.so.7: cannot open shared object file: No such file or directory |
显然这边需要设定LD_LIBRARY_PATH变量
1 | export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/path/to/protobuf/lib |
评注: /path/to/protobuf/lib为实际的protobuf安装路径
静态链接方式
简单的在lib目录移除所有动态连接库(so)文件,
然后进行编译, 使用ldd分析
直接执行app就可以了
总结:
这边主要讲述了protobuf的编译/安装, 以及小demo编写, 重要的讲述了静态链接和动态链接的区别. 网上资料多以动态链接居多, 但实际上静态链接的方式的需要更直接些.
posted on 2014-09-26 16:50 mumuxinfei 阅读(7831) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构