Haskell交叉编译ARM处理器报错求助:Hadrian构建失败排查
Haskell交叉编译到Android aarch64失败:Unknown OS android
问题分析
报错中的Unknown OS android表明GHC的构建系统(configure + Hadrian)默认未将Android识别为支持的操作系统——即便Android基于Linux内核,GHC的平台检测逻辑也需要明确适配才能正常工作。
解决方案
1. 完善环境变量配置
除基础的CC/CXX/LD/AR外,还需指定NDK的sysroot路径及Android API级别,确保编译器能正确找到系统头文件和库:
export NDK_PATH=/home/username/NDK export SYSROOT=$NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64/sysroot export CC=$NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang export CXX=$NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang++ export LD=$NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android-ld export AR=$NDK_PATH/toolchains/llvm/prebuilt/linux-x86_64/bin/llvm-ar # 传递sysroot和API级别参数 export CFLAGS="--sysroot=$SYSROOT -D__ANDROID_API__=29" export CXXFLAGS="--sysroot=$SYSROOT -D__ANDROID_API__=29" export LDFLAGS="--sysroot=$SYSROOT"
2. 调整configure参数
GHC的configure对带API版本的目标三元组(如aarch64-linux-android29)支持不佳,改用标准的aarch64-unknown-linux-android,同时明确指定build/host/target及sysroot:
./configure \ --build=x86_64-pc-linux-gnu \ --host=aarch64-unknown-linux-android \ --target=aarch64-unknown-linux-android \ --with-sysroot=$SYSROOT \ --disable-large-address-space \ --enable-threads
3. 适配GHC的OS检测逻辑(旧版本GHC需执行)
如果使用GHC 9.0及以下版本,需修改GHC源码的平台检测逻辑,让其将Android识别为Linux变种:
- 编辑
configure.ac,找到OS检测的case分支:
修改为:case "$target_os" in linux*) AC_DEFINE([linux_HOST_OS], [1], [Define if targeting Linux]) ;;case "$target_os" in linux*|android*) AC_DEFINE([linux_HOST_OS], [1], [Define if targeting Linux or Android]) ;; - 执行
autoreconf重新生成configure脚本:autoreconf -i
4. 使用Hadrian的交叉编译风味
运行Hadrian时指定quick-cross风味,优化交叉编译流程:
hadrian/build -j --verbose --flavour=quick-cross
额外注意事项
- 推荐使用GHC 9.2+版本,新版本对Android交叉编译的支持更完善,无需手动修改源码
- 确保NDK版本与GHC兼容,建议使用NDK 21+ LTS版本
内容的提问来源于stack exchange,提问作者tgvp
相关产品推荐
相关产品推荐

