安装Protobuf 21.2后编译C++示例出现arm64架构符号缺失错误
解决Protobuf编译链接时
Undefined symbols for architecture arm64错误 可能的原因及修复方案
1. Protobuf编译架构不匹配
你用默认./configure编译的Protobuf库可能不是arm64架构,和当前系统(比如M系列Mac)的架构冲突,导致链接时找不到对应符号。
重新编译安装Protobuf,指定arm64架构:
./autogen.sh # 针对M系列Mac使用此配置,其他arm64系统可调整--host参数 ./configure --host=aarch64-apple-darwin make clean && make && make check && sudo make install
2. 链接库顺序错误
GCC/G++链接时,依赖库必须放在被依赖的源文件之后。你当前命令把-lprotobuf放在了源文件前面,调整顺序即可:
g++ -o test test.cpp test.pb.cc -I /usr/local/include -L /usr/local/lib -std=c++11 -lprotobuf
(简化-I路径为/usr/local/include,编译器会自动找到google/protobuf下的头文件)
3. 系统自带Protobuf版本冲突
部分系统预装了旧版Protobuf,可能导致链接时调用系统库而非你安装的21.2版本。先指定优先使用手动安装的库:
# macOS export DYLD_LIBRARY_PATH=/usr/local/lib:$DYLD_LIBRARY_PATH # Linux export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
之后再执行编译命令。
4. 验证库架构是否正确
先确认安装的Protobuf库是arm64架构:
# macOS lipo -info /usr/local/lib/libprotobuf.dylib # Linux file /usr/local/lib/libprotobuf.so
如果输出不含arm64或aarch64,说明库架构错误,必须重新编译。
验证流程
- 重新生成proto对应的C++文件:
protoc -I=./ --cpp_out=./ ./test.proto
- 用调整后的命令编译程序:
g++ -o test test.cpp test.pb.cc -I /usr/local/include -L /usr/local/lib -std=c++11 -lprotobuf
内容的提问来源于stack exchange,提问作者Maik Fang
相关产品推荐
相关产品推荐

