为什么树莓派4编译GRPC项目时链接器找不到absl引用?
解决方案
1. 清理旧编译残留
先删除系统中所有遗留的grpc、absl、protobuf相关文件,避免旧版本干扰:
sudo rm -rf /usr/local/lib/libabsl* /usr/local/lib/libgrpc* /usr/local/lib/libprotobuf* sudo rm -rf /usr/local/include/absl /usr/local/include/grpc /usr/local/include/grpcpp /usr/local/include/google/protobuf
2. 统一参数重新编译gRPC
之前单独给absl加ABI参数、未和gRPC编译参数对齐的操作会导致ABI不匹配,全程使用gRPC内置的absl模块编译即可,无需单独安装absl。
进入gRPC源码的build目录,执行以下cmake命令:
cmake \ -DgRPC_INSTALL=ON \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_COMPILER=clang \ -DCMAKE_CXX_COMPILER=clang++ \ -DCMAKE_CXX_STANDARD=17 \ -DCMAKE_CXX_FLAGS="-D_GLIBCXX_USE_CXX11_ABI=1" \ -DgRPC_ABSL_PROVIDER=module \ -DgRPC_CARES_PROVIDER=module \ -DgRPC_PROTOBUF_PROVIDER=module \ -DgRPC_RE2_PROVIDER=module \ -DgRPC_SSL_PROVIDER=module \ -DgRPC_ZLIB_PROVIDER=module \ -j4 ../
注:_GLIBCXX_USE_CXX11_ABI参数需要和业务代码编译参数保持一致,Ubuntu 20.04默认使用C++11 ABI,填1即可
之后执行编译安装:
make clean make -j4 sudo make install sudo ldconfig
3. 调整链接顺序
GNU链接器对静态库的依赖顺序有严格要求:依赖方需要放在被依赖方的前面,所有absl库必须放在grpc相关库的后方。使用以下命令编译业务代码:
clang++ -std=c++17 \ -iquote /home/ubuntu/gameserver/server/include \ -include /usr/local/include/grpcpp/support/method_handler.h \ -L /usr/local/lib \ src/gameserver.pb.cc src/gameserver.grpc.pb.cc server_test.cpp \ -o server_test \ -lgrpc++_reflection \ -lgrpc++ \ -lgrpc \ -lgrpc_unsecure \ -lgpr \ -lprotobuf \ -labsl_statusor \ -labsl_status \ -labsl_synchronization \ -labsl_base \ -labsl_strings \ -labsl_malloc_internal \ -labsl_stacktrace \ -labsl_raw_logging_internal \ -labsl_time \ -labsl_graphcycles_internal \ -labsl_spinlock_wait \ -labsl_symbolize \ -lz \ -ljsoncpp \ -lpthread
如果仍有absl相关符号缺失,执行以下命令生成全量absl链接参数,替换上述命令中所有absl相关的参数即可:
find /usr/local/lib -name "libabsl*.a" | sort | sed 's/\/usr\/local\/lib\//-l/g' | sed 's/\.a//g'
内容的提问来源于stack exchange,提问作者x84a01
相关产品推荐
相关产品推荐

