如何将Protobuf编译产物导出为可供其他项目链接的C++静态库
制作包含Protobuf生成代码的C++静态库方法
前置准备
- 安装和你项目版本匹配的
protoc编译器,同时准备好对应版本的Protobuf基础库(protoc生成的C++代码本身依赖protobuf的基础实现,没有这个库后续链接会报符号缺失) - 把所有需要用到的
.proto文件整理到统一目录,避免生成代码时路径混乱
生成C++版本的Protobuf代码
进入proto文件存放目录,执行命令生成C++代码,指定输出目录即可:
protoc --cpp_out=./cpp_gen your_biz1.proto your_biz2.proto
命令执行完成后,指定的cpp_gen目录下会生成每个proto对应的.pb.cc实现文件、.pb.h头文件。注意这部分是自动生成的代码,不要手动修改,后续proto字段更新直接重新跑生成命令覆盖就行
编译打包静态库
编译前注意事项
- 编译
.pb.cc文件时,必须和后续调用这个静态库的业务项目使用完全一致的C++标准选项(比如都用-std=c++17)、一致的编译器版本,否则会出现ABI不兼容、链接报错的问题 - 编译时需要把Protobuf的头文件搜索路径加到编译参数里,否则会找不到
google/protobuf/前缀的依赖头
具体操作(GCC/Clang环境)
- 先把所有
.pb.cc编译为位置无关的目标文件:
g++ -c -std=c++17 -I/your/protobuf/include/path -I./cpp_gen ./cpp_gen/*.pb.cc -fPIC
执行完当前目录会生成所有.pb.cc对应的.o目标文件
2. 用ar工具把所有目标文件打包为静态库:
ar rcs libpb_biz.a *.o
最终生成的libpb_biz.a就是你需要的静态库文件
其他项目调用配置
其他C++项目要链接使用这个静态库,只需要配三个项:
- 头文件搜索路径:添加
.pb.h文件所在的cpp_gen目录,同时添加依赖的Protobuf头文件目录 - 库文件搜索路径:添加
libpb_biz.a所在的目录 - 链接依赖:链接时注意顺序,先链接你自己打包的
libpb_biz.a,再链接Protobuf的基础库libprotobuf.a,顺序写反很容易出现符号找不到的报错
常见踩坑提醒:静态库是和平台、编译器强绑定的,Linux下用GCC打包的
.a文件不能直接拿到Windows下给MSVC用,也不能给macOS下的Clang直接用,换环境需要重新走编译打包流程。
内容的提问来源于stack exchange,提问作者Peter Boshra
相关产品推荐
相关产品推荐

