【Qt 学习之路】Qt 如何在 Windows上 交叉编译ARM 程序

1、概述

习惯于开发Arm板上的程序时去Ubuntu上进行开发,如今就想懒一下,不想来切双系统。那么Qt如何在Windows上开发Arm呢?今天我们一起来盘盘吧~

2、确认环境

2.1、各种环境准备

  • 操作系统版本:Windows11
  • Qt 版本:Qt 5.12.12(其他版本也可以,我电脑上之前有5.12.12,方便做对比)
  • ARM板:aarch64(知识普及:aarch64 是 ARMv8 架构中的 64 位指令集)

2.2、查看ARM板 32位 还是 64位

uname -m

案例:
在这里插入图片描述
如果系统是 32 位,则将显示 armv7l 。
如果系统是 64 位,则将显示 aarch64 。

2.3、查看当前 Qt 环境

如果只是正常的安装了官网的Qt版本,应该和我的情况差不多。如下图:
在这里插入图片描述

3、准备交叉编译

3.1、下载 Qt 源码

因为我装的是:Qt5.12.12,所以我们找到Qt5.12.12的源码,重新进行aarch64的交叉编译
下载链接:https://download.qt.io/new_archive/qt/5.12/5.12.12/single/
在这里插入图片描述
我们选择zip压缩包,将源码解压后放在“D:\Qt\qt-everywhere-src-5.12.12”路径下。
在路径“D:\Qt\qt-everywhere-src-5.12.12\qtbase\mkspecs”文件夹下,可以找到 linux-aarch64-gnu-g++文件夹。
在这里插入图片描述

用打开文件夹内的qmake.conf文件,即可查看源码编译时使用的编译器,这里默认使用的编译器是aarch64-linux-gcc和aarch64-linux-g++。
在这里插入图片描述

3.2、安装交叉编译器

3.2.1、下载交叉编译器

下载路径:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/downloads
在这里插入图片描述

这里我们选择 Qt5.12.12 配套的交叉编译器:gcc-arm-11.2-2022.02-mingw-w64-i686-aarch64-none-linux-gnu.zip

如有需要,复制这个链接:https://developer.arm.com/-/media/Files/downloads/gnu/11.2-2022.02/binrel/gcc-arm-11.2-2022.02-mingw-w64-i686-aarch64-none-linux-gnu.zip?rev=47c49a43aa81408b9688daea870832a5&hash=83CD11A792F93343A917E741132D5CD7

3.2.2、更改名称 Qt5.12.12-ARMv8

安装路径:将gcc-arm-11.2-2022.02-mingw-w64-i686-aarch64-none-linux-gnu.zip解压后,放在 D盘 Qt 文件夹下,与我们的源码同级目录,更新名字为Qt5.12.12-ARMv8。

在这里插入图片描述

3.2.3、设置环境变量

在这里插入图片描述

3.3、安装关联软件

3.3.1、安装Active Perl

3.3.1.1、下载 ActiveState Perl

在这里插入图片描述

下载地址:https://www.perl.org/get.html
进到官网下,我们选择Windows上的ActiveState Perl:

在这里插入图片描述

下载Window11 架构下的ActivePerl 5.12以上版本,我们直接下载最新的 5.36。
在这里插入图片描述
我们这里直接点击 无需账号继续下载在这里插入图片描述
直接安装,没有Win11,选择Win10。
在这里插入图片描述

按照步骤一步步来
在这里插入图片描述

3.3.1.2、安装 ActiveState Perl

1、安装 ActiveState 命令行工具
在这里插入图片描述
输入Y 接受继续

2、安装 ActiveState-Projects/ActiveState-Perl-5.36.0

state checkout ActiveState-Projects/ActiveState-Perl-5.36.0 .

在这里插入图片描述
3、将此运行时设置为系统上的默认运行时。运行状态使用重置来取消设置

state use ActiveState-Perl-5.36.0

在这里插入图片描述

3.3.1.3、设置环境变量

安装完成后将“<安装路径>\bin”添加至环境变量。
在这里插入图片描述

3.3.2、安装python

下载链接:https://www.python.org/downloads
下载Window11 架构下的Python3以上版本。

同样设置环境变量:安装完成后将安装路径添加至环境变量。

测试是否成功

python -V

在这里插入图片描述

3.3.3、安装 MinGW 开发工具集

3.3.3.1、下载 开发工具集

下载链接(这里在速度太慢,我传到CSDN上):https://download.csdn.net/download/u014597198/88864307

3.3.3.2、安装 开发工具集

直接解压,然后放在“D:\Qt\MinGW64”路径下,复制出 make.exe。
将安装好的qt地址中的mingw中bin目录下的mingw32-make.exe复制一份改名为make.exe即可。因为windows上名字叫mingw32-make,linux上名字叫make,所以在windows上交叉编译时会找不到make,可能会打不开进程。
在这里插入图片描述

3.3.3.3、设置环境变量

将“D:\Qt\MinGW64\bin”添加至环境变量。

在这里插入图片描述

4、编译 Qt 源码

4.1、进入 Qt 源码 路径

进入 D:\Qt\qt-everywhere-src-5.12.12 路径,按住shift,右键打开Powershell,如下图:
在这里插入图片描述

4.2、编译配置

1、执行命令

.\configure.bat -release -opensource -prefix D:\Qt\Qt5.12.12-ARMv8 -nomake tests -nomake examples -no-opengl -skip qtvirtualkeyboard -platform win32-g++ -xplatform aarch64-linux-gnu-g++

在这里插入图片描述
2、如果根据命令行提示,输入y,最后完成编译配置。

配置属性说明:

3.1 -release:编译release版本。
3.2 -opensource:表示开源许可;
3.3 -prefix Qt安装路径。根据上文命令,编译好的Qt库放在D:\Softwares\Qt5.12.11-ARMv8目录下。
3.4 -nomake:表示不编译后面参数指定的模块;
3.5 -no-opengl 表示不安装OpenGL。
3.6 -skip 表示不安装的qt工具包,工具包的名称即为源码路径下的文件夹名称。-skip qtvirtualkeyboard表示跳过qtvirtualkeyboard,没有相应库环境,不编译,否则编译和安装过程中可能会报错。
3.7 -platform:为win32-g++,即指定本地编译器配置目录,到qtbase\mkspecs\ win32-g++目录里读取qmake.conf文件,找到本地编译工具来编译qmake。
3.8 -xplatform 表示使用源码路径qtbase\mkspecs\linux-aarch64-gnu-g++文件夹内的配置,编译时会自动去该路径下找到配置文件进行编译。

在命令行内输入“configure -help”命令,可查看详细配置说明。

在这里插入图片描述
这里我们复制带none的文件,粘贴的附件去掉none,如下图:
在这里插入图片描述
重新执行命令,成功:
在这里插入图片描述

4.3、编译源码

继续执行命令,完成编译。

mingw32-make -j2

在这里插入图片描述
遇到错误,查找源码文件是对的,查看是否是编译器的错误
在这里插入图片描述

4.4、编译安装(耗时约20分钟)

在命令行下,执行命令,完成安装。

mingw32-make install

5、配置Qt Creator

QtCreator4.9.1的配置过程和之前的QtCreator版本配置项相同,配置位置略有差异,主要配置流程如下:
1、配置QMake
打开“工具->选项->kits”,选择Qt Version页面
在这里插入图片描述
点击右侧添加按键,选择编译出的源码路径下的bin文件(就是配置Qt源码编译后存放编译结果的那个路径)夹内的QMake.exe即可
在这里插入图片描述
2、配置编译器Compilers
该部分主要添加C++和C的编译器,用于编译arm版本的代码,
设置GCC的C编译器,打开“工具->kits->编译器(Compilers)”
在这里插入图片描述
右侧选择“添加->GCC->C”,编译器路径即为gnu工具中的C编译器aarch64-linux-gnu-gcc所在路径,ABI设置为arm-linux-generic-elf-64bit
设置GCC的C++编译器,打开“工具->kits->编译器(Compilers)”,右侧选择“添加->GCC->C++”,编译器路径即为gnu工具中的C++编译器aarch64-linux-gnu-g++所在路径,ABI设置为arm-linux-generic-elf-64bit
在这里插入图片描述
配置完成后在kits的编译器页面会出现对应的配置项,如下
在这里插入图片描述
3、配置Debuggers
该部分配置调试工具,使用gnu编译器所在文件夹下的gdb调试工具,
打开“工具->选项->kits->Debuggers”,点击Add添加新的调试工具,这里选择gnu编译工具集合下的aarch64-linux-gnu-gdb工具,在gnu工具下的aarch64-linux\bin路径
在这里插入图片描述
配置结束后会在Debuggers页面下新增调试工具
在这里插入图片描述
4、配置CMake
该部分用于编译得到嵌入式系统下的执行程序或者库文件,使用QtCreator自带的CMake编译工具,个人理解这里的CMake是交叉编译工具,之前配置的QMake是Qt代码的编译工具
依次选择“工具->选项->Kits->CMake”,点击Add按键添加新的编译工具,选择添加mingw32-make.exe,所在路径
“<QtCreator安装路径> \Tools\mingw730_64\bin\mingw32-make.exe”
在这里插入图片描述
配置成功后在CMake页面会有显示
在这里插入图片描述
4、添加Arm64的编译环境(构建套件Kits)
5、该部分用于配置编译Qt代码时的编译环境,基本是将前面的配置内容添加到编译环境里
6、依次选择“工具->选项->Kits->构建套件(Kit)”,点击右侧Add按键进行配置,配置项目选择前面配置好的内容即可,主要配置内容见下图
在这里插入图片描述
配置完成后再次进到该“构建套件(Kit)”页面会有如下显示,其中linux_arm64为新增加的编译环境,前面两个是QtCreator安装时配置好的构建环境
在这里插入图片描述
第七步,创建Qt工程验证
目前QtCreator编译linux arm64的环境已经已经配置完成,验证是否可以进行编译,
Ctrl+N创建一个新的桌面应用程序,构建套件时选择linux_arm64即可
在这里插入图片描述
待程序创建好后,在工作窗口左侧“项目”界面修改Override make选项,点击Make选项右侧的详情即可列出override make栏,选择QtCreator安装路径下的\Tools\mingw730_64\bin\mingw32-make.exe。

在这里插入图片描述
然后ctrl+b进行工程编译即可,debug和profile模式设置类似,将上图中Release选项调整为debug或者profile即可,仍旧是设置override make栏。
编译生成的执行程序或者库文件见上图中“构建目录”中列出的路径,注意只能编译,而不能运行。

<think>好的,我现在需要解决用户在加载预训练模型时遇到的SafetensorError,具体是'MetadataIncompleteBuffer'错误。这个问题出现在使用Hugging Face的Transformers库的from_pretrained方法时。用户可能对Safetensors和相关的错误不太熟悉,所以我得先理解这个错误的原因,然后给出解决方案。 首先,我应该回忆一下Safetensors的相关知识。Safetensors是Hugging Face开发的一种安全且高效的文件格式,用于替代传统的PyTorch bin文件。它能够加快加载速度,并且避免反序列化时的安全风险。而MetadataIncompleteBuffer错误通常与文件头部的元数据不完整或损坏有关。可能的原因包括文件下载不完整、文件损坏,或者版本不兼容。 接下来,我需要考虑用户的具体情况。用户可能在下载模型时网络中断,导致文件不完整。或者他们使用的库版本过旧,无法正确解析Safetensors文件。还有可能模型文件本身存在问题,比如上传时损坏,或者使用了不兼容的Safetensors版本生成的文件。 针对这些可能的原因,我应该分步骤给出解决方案。首先建议用户检查文件完整性,重新下载模型文件。然后,确保所有相关库(如Transformers、Safetensors)更新到最新版本,以解决兼容性问题。如果问题依旧,可以尝试禁用Safetensors,强制使用PyTorch格式,这样虽然牺牲一些性能,但可能绕过当前的问题。此外,用户可能还需要清除缓存文件,因为旧的缓存可能导致问题。 另外,我需要考虑用户可能不知道如何执行这些步骤,比如如何检查文件哈希,或者如何更新库。因此,在回答中需要给出具体的命令行指令,例如使用`wget`重新下载,或者使用`pip install --upgrade`命令更新库。同时,如果用户禁用Safetensors,需要指导他们在from_pretrained方法中添加参数`use_safetensors=False`。 最后,应该提醒用户,如果所有方法都失败,可以联系模型维护者确认文件是否有问题,或者到社区寻求帮助。例如,Hugging Face的论坛或GitHub仓库都是寻求支持的好地方。 现在,我需要确保回答结构清晰,步骤明确,并且涵盖所有可能的原因和解决方法。同时,按照用户的要求,生成相关问题,帮助用户进一步理解Safetensors和相关错误。</think>### 解决 `SafetensorError: MetadataIncompleteBuffer` 错误 #### 问题原因分析 此错误通常发生在使用 `transformers` 库的 `from_pretrained` 方法加载 Safetensors 格式的模型时,可能由以下原因导致: 1. **模型文件损坏**:文件下载不完整或传输过程中数据丢失 2. **版本不兼容**:使用的 `safetensors` 或 `transformers` 库版本过低 3. **元数据解析失败**:Safetensors 文件头部的元数据结构不符合预期格式[^1] #### 逐步解决方案 1. **验证文件完整性** - 重新下载模型文件(建议使用断点续传工具) ```bash wget --continue https://huggingface.co/[模型路径]/resolve/main/model.safetensors ``` - 检查文件哈希值是否与模型仓库中声明的匹配 2. **升级依赖库** ```bash pip install --upgrade transformers safetensors ``` 3. **清除缓存** ```python from transformers import AutoModel model = AutoModel.from_pretrained("模型名称", force_download=True) # 强制重新下载 ``` 4. **禁用 Safetensors(临时方案)** ```python model = AutoModel.from_pretrained("模型名称", use_safetensors=False) ``` 5. **检查文件编码(开发者场景)** 若需手动检查 Safetensors 文件: ```python from safetensors import safe_open with safe_open("model.safetensors", framework="pt") as f: print(f.keys()) # 验证元数据是否可读 ``` #### 技术原理说明 Safetensors 文件结构包含: $$ \text{Header} + \text{Tensor Data} $$ 其中头部使用 JSON 格式存储张量元数据。当反序列化过程中检测到 JSON 解析失败或长度不匹配时,会触发 `MetadataIncompleteBuffer` 错误[^1]。 相关问题
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沙振宇

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值