You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么树莓派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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:45:10