使用Hunter编译Android平台Boost库时ABI不匹配问题咨询
问题根因
这个问题是两个点叠在一起导致的:
- Hunter会根据工具链标识缓存第三方库的构建产物,你第一次编译armeabi-v7a时生成的32位arm架构Boost库已经存在本地缓存里,后续切换ABI时,如果Hunter的工具链判定逻辑没识别到架构变化,会直接复用这份错误的旧产物。
- 你用的v0.24.0版本Hunter里的Boost构建脚本,不会自动从Android NDK的工具链参数里提取目标架构、地址模型信息,交叉编译场景下Boost自带的b2构建系统自动检测经常失效,会默认沿用第一次构建时的arm 32位配置,根本不会跟着你设置的ANDROID_ABI切换。
解决步骤
- 先清干净旧缓存
直接删掉用户目录下的~/.hunter文件夹,同时把你项目当前的build编译目录整个删掉,旧的错误缓存、CMake缓存不删干净,后面改了配置也大概率会被旧文件干扰。 - 显式给Boost传架构参数,别靠自动检测
在CMake配置里,调用hunter_add_package之前,加一段逻辑,根据当前选中的ANDROID_ABI手动指定Boost要编译的架构和地址模型:
# 注意:这段代码要放在hunter_add_package(Boost ...)之前 if(ANDROID_ABI STREQUAL "armeabi-v7a") set(_boost_arch "arm") set(_boost_addr_model "32") elseif(ANDROID_ABI STREQUAL "arm64-v8a") set(_boost_arch "arm") set(_boost_addr_model "64") elseif(ANDROID_ABI STREQUAL "x86") set(_boost_arch "x86") set(_boost_addr_model "32") elseif(ANDROID_ABI STREQUAL "x86_64") set(_boost_arch "x86") set(_boost_addr_model "64") endif() hunter_config(Boost VERSION "1.78.0" # 填当前Hunter版本默认绑定的Boost版本即可,不需要特意升级,版本不对的话Hunter配置阶段会直接提示可用版本,替换就行 CMAKE_ARGS BUILD_ARCHITECTURE=${_boost_arch} ADDRESS_MODEL=${_boost_addr_model} )
- 确认CMake逻辑顺序没乱
相关配置的顺序必须严格按下面来,乱序很容易导致参数不生效:- 最开头先调用
HunterGate,不要在HunterGate之前写project()这类会触发编译器检测的指令 - 再设置
Boost_USE_*系列开关、上面写的架构判断逻辑 - 接着调用
hunter_add_package(Boost COMPONENTS ${BOOST_COMPONENTS}) - 最后调用
find_package(Boost CONFIG COMPONENTS ${BOOST_COMPONENTS})
- 最开头先调用
- 重新编译验证
重新跑你的Android编译脚本,盯着Boost构建阶段的日志看,切到x86_64 ABI时如果日志输出default address-model: 64-bit、default architecture: x86,就说明参数传对了,后面不会再出架构不兼容的链接错误。
额外提醒
后续切换不同Android ABI编译时,只要换了架构就建议清空build目录重新配置,别在同一个build目录下反复切ABI做增量构建,CMake的缓存机制很容易保留旧的架构参数,平白无故出各种奇怪的编译链接问题。
内容的提问来源于stack exchange,提问作者Vitali
相关产品推荐
相关产品推荐

