静态链接libphonenumber/C++ 8.12.56时出现Abseil链接错误
静态链接libphonenumber/cpp 8.12.56时Abseil链接错误解决办法
问题现象
将项目静态链接至全新构建的libphonenumber/cpp 8.12.56版本时,出现大量Abseil相关的未定义引用错误,示例错误如下:
/usr/bin/ld: ../libphonenumber/cpp/build/libphonenumber.a(phonenumberutil.cc.o): in function `absl::lts_20220623::hash_internal::MixingHashState::MixingHashState()': phonenumberutil.cc:(.text._ZN4absl12lts_2022062313hash_internal15MixingHashStateC2Ev[_ZN4absl12lts_2022062313hash_internal15MixingHashStateC5Ev]+0xb): undefined reference to `absl::lts_20220623::hash_internal::MixingHashState::kSeed' /usr/bin/ld: ../libphonenumber/cpp/build/libphonenumber.a(phonenumberutil.cc.o): in function `absl::lts_20220623::hash_internal::MixingHashState::CombineContiguousImpl(unsigned long, unsigned char const*, unsigned long, std::integral_constant<int, 8>)': phonenumberutil.cc:(.text._ZN4absl12lts_2022062313hash_internal15MixingHashState21CombineContiguousImplEmPKhmSt17integral_constantIiLi8EE[_ZN4absl12lts_2022062313hash_internal15MixingHashState21CombineContiguousImplEmPKhmSt17integral_constantIiLi8EE]+0x56): undefined reference to `absl::lts_20220623::hash_internal::MixingHashState::CombineLargeContiguousImpl64(unsigned long, unsigned char const*, unsigned long)'
- libphonenumber自身测试程序
libphonenumber_test可正常运行 - 项目可正常链接的最后一个版本为8.12.39
- 构建环境:Debian Buster,g++ 8.3.0-6,cmake 3.13.4,已安装README指定依赖及
default-jre-headless,尝试过C11/C17标准及多个中间版本均无效
解决方案
1. 确保libphonenumber依赖的Abseil子模块正确构建
libphonenumber从较新版本开始依赖特定版本的Abseil,需确认构建时已编译其自带的Abseil子模块:
- 进入libphonenumber/cpp目录,执行
git submodule update --init拉取完整的Abseil子模块 - 重新构建libphonenumber,确保Abseil被编译为静态库(默认构建流程会处理,但需确认构建日志中包含Abseil库的编译步骤)
2. 链接时显式添加所有Abseil依赖库
静态链接libphonenumber时,需同时链接其依赖的所有Abseil静态库,不能仅链接libphonenumber.a:
- 查看libphonenumber构建目录下的
lib文件夹,找到所有以libabsl_开头的静态库(如libabsl_hash.a、libabsl_base.a、libabsl_core_headers.a等) - 将这些Abseil库加入到项目的链接命令中,放在
libphonenumber.a之后(链接顺序会影响符号解析)
3. 统一编译选项与ABI设置
确保项目与libphonenumber使用完全一致的编译配置:
- 统一C++标准:比如都指定
-std=c++17(或项目之前使用的标准,但需与libphonenumber构建时的标准匹配) - 检查ABI兼容性:确认两者是否定义了相同的
_GLIBCXX_USE_CXX11_ABI宏(可通过查看编译命令中的-D_GLIBCXX_USE_CXX11_ABI=0或1来确认,两者必须一致)
4. 使用CMake自动处理依赖(推荐)
如果项目使用CMake构建,直接引入libphonenumber的CMake配置可自动解决依赖问题:
# 在项目CMakeLists.txt中添加 find_package(libphonenumber REQUIRED PATHS "../libphonenumber/cpp/build") target_link_libraries(your_project_name PRIVATE libphonenumber::libphonenumber)
这样CMake会自动识别并链接libphonenumber及其依赖的Abseil库,无需手动指定所有库文件。
内容的提问来源于stack exchange,提问作者Joe H
相关产品推荐
相关产品推荐

