1. 为什么要在Windows上为ARM64设备开发Qt应用你可能觉得这事儿有点绕。明明目标设备是ARM64的开发板比如TI的AM62x系列为啥不直接在Linux虚拟机或者另一台Linux主机上开发呢我刚开始也这么想直到实际项目压下来。很多团队的主力开发环境就是Windows尤其是硬件驱动、底层调试工具链很多厂商提供的配套软件和文档都是以Windows为主的。让整个团队为了一个GUI应用去切换主力操作系统成本太高了。所以在Windows10上搭建一套完整的、面向ARM64的Qt交叉编译环境就成了一个非常实际的“刚需”。这不仅仅是“能编译出来”就行。我们最终要的是一个高效的开发工作流在熟悉的Windows桌面环境下用Qt Creator写代码、设计界面点一下构建就能生成一个能在ARM64开发板上直接运行的、带图形界面的可执行文件。这听起来很美好但一路上的“坑”可不少。从选择合适的交叉编译工具链到配置Qt的qmake再到Qt Creator里那一堆编译器、调试器、Qt版本的设置每一步都可能让你卡上半天。不过别担心我把自己趟过的路踩过的坑都整理出来了。跟着这篇指南你完全可以在你的Windows10电脑上复现出一套稳定可用的ARM64 Qt开发环境。2. 环境准备兵马未动粮草先行在开始配置之前我们得把需要的“粮草”都备齐。这个过程有点像拼乐高零件齐了后面按图纸组装就顺利多了。如果缺了某个关键部件整个流程就会卡住。2.1 核心工具清单与获取首先我们列个清单看看都需要些什么Windows 10 操作系统这是我们的开发主机环境。建议使用较新的版本确保系统更新完整避免一些底层兼容性问题。Qt Creator IDE这是我们写代码和项目管理的主战场。我强烈建议使用和你的Qt库版本匹配的Qt Creator。例如我这次用的是qt-opensource-windows-x86-5.14.2这个安装包。它里面自带了Qt Creator以及对应版本的MinGW编译器用于在Windows上编译和仿真运行。你可以从Qt官网的存档目录找到历史版本。ARM64交叉编译工具链这是整个流程的核心负责把我们在Windows上写的C代码编译成ARM64 CPU能识别的指令。我选用的是gcc-arm-10.3-2021.07-mingw-w64-i686-aarch64-none-linux-gnu。这个名字很长拆解一下“gcc-arm-10.3”是GCC版本“mingw-w64-i686”表示这个工具链本身是在Windows通过MinGW上运行的“aarch64-none-linux-gnu”表示它生成的目标代码是面向ARM64aarch64架构、运行在Linux系统上的。这个工具链可以从ARM开发者网站或Linaro网站下载。Make工具Qt的构建系统qmake最终会生成Makefile需要make命令来驱动整个编译链接过程。Windows本身没有make我们需要单独安装。一个经典且稳定的选择是make 3.81。也可以使用MSYS2或Cygwin中提供的make但独立版本更干净。预编译的Qt库for ARM64与qmake这是最大的一个“坑”。Qt Creator需要知道如何为ARM64目标构建Qt应用这依赖于一个特殊的qmake。这个qmake本身是运行在Windows上的但它知道Qt库ARM64版本的头文件和库文件在哪里也知道如何调用我们上面准备的ARM64交叉编译器。通常你需要自己用交叉编译工具链在Linux上编译Qt源码得到ARM64的Qt库和这个“宿主qmake”。这个过程极其耗时且容易出错。幸运的是社区里经常有热心开发者分享他们编译好的成果。比如原始资料中提到的softw-arm64.rar压缩包里面就包含了配置好的qmake和对应的mkspecs文件能极大简化我们的工作。注意使用他人预编译的库时务必确认其GCC版本、Qt版本与你的工具链和目标板系统特别是glibc版本兼容。不匹配可能导致程序在板子上无法运行。2.2 工具安装与路径规划东西下载好后别急着乱装。良好的路径规划能让后续配置事半功倍。我建议在某个盘符如D盘下创建一个专门的工作目录比如D:\ARM64_Qt_Dev。然后在这个目录下创建几个子文件夹Toolchains: 用于存放交叉编译工具链。把下载的gcc-arm-10.3...压缩包解压到这里比如路径变为D:\ARM64_Qt_Dev\Toolchains\gcc-arm-10.3...。Qt_ARM64: 用于存放预编译的ARM64 Qt库和qmake。把softw-arm64.rar解压到这里。Make: 存放make工具。把make 3.81的可执行文件如make.exe放在这里。接下来将Make目录的路径D:\ARM64_Qt_Dev\Make添加到系统的环境变量PATH中。这样无论在命令行还是Qt Creator里系统都能找到make命令。对于交叉编译工具链可以加也可以不加到PATH因为我们后续会在Qt Creator里绝对路径引用它这样更清晰。最后安装Qt Creator。这个就按常规的Windows软件安装流程进行即可安装路径可以保持默认。3. 配置Qt Creator打造专属的ARM64构建套件工具都到位了现在打开Qt Creator。一开始它只能编译Windows本地的程序。我们的任务就是告诉它“嘿我还有一个ARM64的远程设备请用另一套工具来编译。”3.1 配置交叉编译器首先我们得把那个强大的ARM64交叉编译器介绍给Qt Creator认识。打开Qt Creator进入工具-选项。在左侧找到Kits套件选项。注意有些旧版本可能在编辑-首选项里。在Kits设置页先切换到编译器标签页。点击添加按钮在下拉菜单中选择GCC-C。这会添加一个新的C编译器配置。给它起个容易辨认的名字比如“GCC 10.3 ARM64 Linux GNUEABI”。最关键的一步在编译器路径这里点击浏览找到你的交叉编译工具链里的g可执行文件。它的完整路径通常类似于D:\ARM64_Qt_Dev\Toolchains\gcc-arm-10.3...\bin\aarch64-none-linux-gnu-g.exe这个g.exe就是ARM64的C编译器。添加后Qt Creator会自动检测出ABI应用二进制接口信息比如arm-linux-generic-elf-64bit。这证明它识别成功了。3.2 配置Qt版本qmake接下来配置最重要的Qt版本这本质上是配置qmake。在同一个选项对话框中切换到Qt Versions标签页。点击添加按钮。浏览并选择你从预编译包中得到的那个特殊的qmake。它的路径可能像这样D:\ARM64_Qt_Dev\Qt_ARM64\bin\qmake.exe选择后Qt Creator会读取这个qmake的信息。给它起个名字例如“Qt 5.14.2 ARM64 (host qmake)”。版本号应该会自动显示为5.14.2。 这个qmake是“宿主qmake”它在Windows上运行但内部已经配置好了指向ARM64架构的Qt库和交叉编译器。它是连接你的项目代码、Qt库和交叉编译器的桥梁。3.3 组装构建套件Kit现在把前面配置好的零件组装成一个完整的“生产线”——构建套件。切换到Kits标签页。点击添加按钮创建一个新的套件。给它起个响亮的名字比如“TI AM62x ARM64 (GCC 10.3)”。开始关键装配设备类型选择通用Linux设备或桌面。因为我们最终是通过文件传输到板子并非直接在线调试所以选哪个影响不大。如果后续配置了SSH直接部署可以选通用Linux设备。设备暂时保持默认的本地PC。Sysroot如果你有目标板文件系统的完整根目录拷贝用于链接时查找库可以在这里设置。对于简单应用可以先留空。编译器在C下拉框中选择我们刚才创建的“GCC 10.3 ARM64 Linux GNUEABI”。Qt版本在下拉框中选择我们刚才创建的“Qt 5.14.2 ARM64 (host qmake)”。Qt mkspec如果你使用的预编译qmake包里的mkspecs配置正确这里可以留空qmake会自动使用对应的spec如linux-aarch64-gnu-g。如果遇到问题可以在这里强制指定。调试器由于是交叉编译Windows上的调试器如CDB、GDB无法直接调试ARM64程序。这里通常无需配置或者选择一个ARM64的交叉调试器如aarch64-none-linux-gnu-gdb.exe用于后续可能的远程调试这需要更复杂的配置。点击确定保存这个套件。至此你的Qt Creator就具备了为ARM64设备编译Qt程序的能力。这个套件就像是一个预设好的“配方”告诉构建系统当用这个套件时请使用ARM64的编译器链接ARM64的Qt库。4. 创建与构建你的第一个ARM64 Qt Widgets应用环境配置好了我们来真刀真枪地创建一个项目体验一下整个流程。4.1 新建工程与套件选择点击文件-新建文件或项目。选择Application-Qt Widgets Application点击选择。给项目起名、选择存放路径这些和普通项目一样。在构建系统这一步选择qmake。这是最经典、与我们的配置兼容性最好的构建系统。CMake也可以但配置起来更复杂一些。到了最关键的一步Kits选择。你会看到列表里至少有两个套件一个是默认的Desktop Qt 5.14.2 MinGW 32-bit用于Windows本地编译和运行另一个就是我们刚刚创建的“TI AM62x ARM64 (GCC 10.3)”。这里一定要勾选我们自定义的ARM64套件。你可以同时勾选多个这样一次可以构建多个平台版本。但在第一次为了清晰可以只勾选ARM64套件。后续步骤类名、UI文件等按默认或你的喜好设置即可。完成创建。4.2 编译与问题排查项目创建好后在Qt Creator左侧的项目模式中确保构建套件选择的是我们的ARM64套件。尝试构建右键点击项目名称选择构建或重新构建。观察底部的编译输出窗口。成功的迹象如果一切配置正确你会看到输出中开始调用aarch64-none-linux-gnu-g进行编译最后生成一个没有.exe后缀的可执行文件比如projectname。这个过程和在Windows上编译本地程序很像只是编译器换成了交叉编译器。常见问题与解决找不到交叉编译器检查Qt Creator中编译器配置的路径是否正确路径中不要有中文或特殊字符。qmake配置错误错误信息可能提示找不到Qt库或头文件。这通常是因为预编译包中的qmake.conf文件里指定的工具链路径或Qt安装路径不对。你需要打开这个文件位于Qt_ARM64/mkspecs/linux-aarch64-gnu-g/qmake.conf修改QMAKE_CXX等变量指向你本地的交叉工具链路径以及QT_INSTALL_PREFIX指向你本地的ARM64 Qt库路径。这是一个精细活也是使用预编译包最常见的调整点。缺少libgcc等库错误编译链接时可能报错找不到libgcc_s.so.1等。这通常是因为交叉工具链的库路径没有正确传递给链接器。除了在qmake.conf中设置也可以在Qt Creator项目的.pro文件中通过QMAKE_LFLAGS或LIBS变量添加-L参数来指定库搜索路径。Windows本地make版本冲突如果你安装了多个make比如Cygwin的可能会调用错误版本的make导致奇怪问题。确保你的PATH环境变量中我们之前添加的Make目录在最前面。4.3 在开发板上运行测试编译成功后你会在项目的构建目录类似build-projectname-ARM64_Kit-Debug下找到一个可执行文件。传输文件通过SD卡、U盘、或者网络SCP/SFTP等方式将这个可执行文件以及它可能依赖的Qt库如果开发板系统里没有的话传输到ARM64开发板上。对于TI AM62x这类Linux系统板子SCP是最方便的方式之一。设置执行权限在开发板的Linux终端里导航到可执行文件所在目录执行chmod x projectname给它添加可执行权限。处理库依赖如果你的开发板文件系统里没有预装对应版本的Qt库你需要将ARM64 Qt库中的lib目录下的相关.so文件也拷贝到板子上并设置LD_LIBRARY_PATH环境变量指向这些库的路径或者将它们放到系统的库目录如/usr/lib。运行在终端中执行./projectname。如果一切顺利你的Qt Widgets图形界面程序就会在开发板的屏幕上或通过虚拟帧缓冲显示出来第一次看到自己Windows上写的界面在ARM板子上跑起来成就感是非常足的。5. 进阶配置与开发技巧基础流程走通后我们可以优化一下开发体验让它更接近本地开发的流畅度。5.1 使用Desktop套件进行快速原型验证你肯定不想每次改一行代码都编译一次ARM64版本然后传文件到板子上看效果那太慢了。我们可以利用Qt Creator的多套件支持。在创建或打开项目时在项目设置里同时勾选ARM64套件和Desktop Qt MinGW套件。这样当你日常编写和调试UI布局、业务逻辑时可以使用Desktop套件进行编译和运行瞬间就能在Windows桌面上看到效果使用体验和开发普通PC软件完全一样。只有当功能在Desktop上测试稳定需要真机验证时再切换到ARM64套件进行构建。这能极大提升开发效率。5.2 配置自定义部署步骤可选但推荐手动拷贝文件太麻烦了。Qt Creator支持自定义部署步骤可以实现一键编译后自动上传到开发板。在项目设置中找到你的ARM64构建配置。在构建步骤之后找到部署步骤点击添加-自定义进程步骤。你可以在这里编写一个命令例如使用scp命令通过SSH将生成的可执行文件自动上传到开发板的指定目录。命令示例需要提前配置好SSH免密登录scp %{buildDir}/your_app_name root192.168.1.100:/home/root/这里的%{buildDir}是Qt Creator的内置变量代表当前构建目录。甚至可以添加第二个自定义步骤在文件上传后自动通过SSH在开发板上执行命令给文件添加权限并运行。配置好后每次点击构建不仅会编译完成后还会自动执行部署步骤将程序上传到板子。如果再结合一些简单的脚本就能实现近乎无缝的“编码-构建-部署”循环。5.3 处理第三方库的交叉编译你的应用很可能需要链接一些第三方C/C库比如串口库、网络库等。这些库也需要用ARM64交叉编译工具链重新编译。获取源码找到你需要的库的源代码。配置交叉编译环境通常库的构建系统是configure(Autotools) 或CMake。你需要设置环境变量告诉它们使用交叉编译器。对于Autotools在命令行中设置set CCaarch64-none-linux-gnu-gcc set CXXaarch64-none-linux-gnu-g set ARaarch64-none-linux-gnu-ar然后运行./configure --hostaarch64-none-linux-gnu --prefix/path/to/install。对于CMake使用工具链文件是最规范的方式。创建一个toolchain.cmake文件指定编译器路径、Sysroot等然后使用-DCMAKE_TOOLCHAIN_FILE/path/to/toolchain.cmake参数调用cmake。编译安装执行make make install将编译好的ARM64版本的头文件和库文件安装到指定目录比如D:\ARM64_Qt_Dev\ARM64_libs。在Qt项目中引用在你的.pro文件中通过INCLUDEPATH添加头文件路径通过LIBS添加库文件路径和库名。例如INCLUDEPATH D:\ARM64_Qt_Dev\ARM64_libs\include LIBS -LD:\ARM64_Qt_Dev\ARM64_libs\lib -lthirdparty这个过程是嵌入式开发中的常态虽然繁琐但一旦把基础库都编译好后续应用开发就会顺畅很多。整个流程下来从环境搭建到工程部署虽然步骤不少但每一步都有其明确的目的。最花时间的往往是第一步——准备好所有正确版本的工具和库。一旦这个“地基”打牢了后面的开发工作就会变得非常顺滑。我在多个基于不同ARM芯片TI、NXP、全志等的项目中都实践过这套方法它最大的好处就是让GUI应用的开发能留在主流的Windows开发环境中进行极大降低了团队的学习和协作成本。当你成功在板子上跑起第一个“Hello World”窗口时那种跨越平台鸿沟的感觉会让你觉得这些折腾都是值得的。