Windows+MinGW交叉编译ARM版QT:配置报错与架构识别异常求助
问题背景
在Windows平台使用MinGW工具链交叉编译ARM版本Qt 5.13.0时,遇到以下两个相关问题:
1. 未添加-sysroot参数时编译失败
执行configure命令:
configure ^ -release ^ -opensource ^ -confirm-license ^ -prefix E:/arm32-gcc6.2.1-qt5.13.0 ^ -nomake tests ^ -nomake examples ^ -no-opengl ^ -skip qtvirtualkeyboard ^ -xplatform linux-arm32-gnu-g++ ^ -prefix E:/arm32-gcc6.2.1-qt5.13.0 ^ -recheck-all
报错信息:
Checking for valid makespec... ERROR: Cannot compile a minimal program. The toolchain or QMakeSpec is broken.
2. 添加-sysroot参数后主机架构检测异常
添加-sysroot E:/lccu3/sysroot参数后,执行configure命令:
configure ^ -release ^ -opensource ^ -confirm-license ^ -prefix E:/arm32-gcc6.2.1-qt5.13.0 ^ -nomake tests ^ -nomake examples ^ -no-opengl ^ -skip qtvirtualkeyboard ^ -xplatform linux-arm32-gnu-g++ ^ -sysroot E:/lccu3/sysroot ^ -prefix E:/arm32-gcc6.2.1-qt5.13.0 ^ -recheck-all
配置检测输出:
Running configuration tests...
Checking for machine tuple... yes
Checking for valid makespec... yes
Checking for target architecture... arm
Checking for host architecture... arm
实际主机为x86架构,但检测结果显示主机架构为arm,需解释该现象原因。
原因解析
1. 未加-sysroot参数编译失败的原因
交叉编译ARM版Qt时,工具链需要ARM架构的系统头文件、库文件来生成目标程序。未指定-sysroot时,MinGW工具链会默认调用Windows本地的x86架构头文件和库,这类文件与ARM架构不兼容,导致无法编译出符合要求的最小测试程序,因此configure报错。
2. 主机架构被识别为arm的原因
Qt 5.13的configure脚本检测主机架构时,会通过编译测试程序或解析gcc -dumpmachine的输出来判断架构。当指定-sysroot后,交叉编译工具链会优先使用sysroot内的ARM架构资源,同时如果你的交叉编译工具链的gcc执行-dumpmachine返回的是ARM相关机器元组(如arm-linux-gnueabihf),脚本会误将该值识别为主机架构。
此外,Qt 5.13的configure脚本在Windows+MinGW交叉编译场景下的架构检测逻辑存在局限性:它没有正确区分**主机(Host)和目标(Target)**的检测路径——主机架构本应基于本地MinGW工具链的x86属性,但脚本错误地复用了交叉编译工具链的输出结果,最终导致主机架构被误判为arm。
内容的提问来源于stack exchange,提问作者tvon

