使用Arm64EC将C/C++ DLL移植到Windows 11上的Arm64

Windows 11上,Arm64EC技术允许开发者加速现有的x64应用程序或依赖项。本文将指导如何将C/C++DLL移植到Arm64平台,使用的技术包括CMake和MSBuild。将通过一个使用Python和Qt快速构建UI应用程序的示例,展示如何将底层的计算密集型工作放在DLL中。

环境准备

在开始之前,请确保已经安装了以下软件和工具:

  • Visual Studio 2022
  • Arm64构建工具,通过Visual Studio安装器中的“个别组件”安装
  • Python 3.11.3版本,需要安装x64和Arm64版本

这些准备工作在本系列教程的第一篇文章中已经介绍过。

使用Arm64EC移植DLL

有两种方式可以将DLL移植到Arm64平台,具体使用哪种方式取决于项目是使用MSBuild还是CMake。本文将展示如何使用CMake进行移植。

要移植DLL,需要修改CMakePresets.json文件,添加一个新的配置块,使其看起来像下面的代码片段:

{ "version": 3, "configurePresets": [ { "name": "windows-base", "hidden": true, "generator": "Ninja", "binaryDir": "${sourceDir}/out/build/${presetName}", "installDir": "${sourceDir}/out/install/${presetName}", "cacheVariables": { "CMAKE_C_COMPILER": "cl.exe", "CMAKE_CXX_COMPILER": "cl.exe" }, "condition": { "type": "equals", "lhs": "${hostSystemName}", "rhs": "Windows" } }, { "name": "x64-release", "displayName": "x64 Release", "inherits": "windows-base", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release" } }, { "name": "arm64EC-release", "displayName": "Arm64EC Release", "inherits": "x64-release", "architecture": { "value": "arm64ec", "strategy": "external" }, "environment": { "CXXFLAGS": "/arm64EC", "CFLAGS": "/arm64EC" } } ] }

保存CMakePresets.json文件后,Visual Studio 2022会自动识别这个新的构建配置,并在构建配置下拉菜单中显示。

从下拉菜单中选择"Arm64EC Release"并构建应用程序。使用单个CMake文件为两个DLL构建,会在out/build/arm64EC-release文件夹下找到编译好的DLL。每个DLL位于相应的文件夹中:

  • Filters或Vectors。

将这些DLL复制到Main-app/Dependencies/Arm64EC-release文件夹中。

更新Main-app/main.py文件中的以下两个变量:

vectorsLibName = os.path.join(rootPath, "Dependencies\\Arm64EC-release\\Vectors.dll") filtersLibName = os.path.join(rootPath, "Dependencies\\Arm64EC-release\\Filters.dll")

然后,可以启动Python应用程序。转到Main-app文件夹并输入python main.py。如果使用虚拟环境,需要先激活它并从requirements.txt文件安装所有依赖。

启动Python应用程序

应用程序启动后,可以看到它像以前一样工作。但是,请注意,计算时间始终为0.00,这是因为使用x64进程加载了DLL。要将它们作为Arm64加载,需要使用Arm64的Python。然而,在撰写本文时,PySide 6尚未通过pip提供Arm64版本。一旦它变得可用,就可以完全测试移植。

  1. 下载Arm64版本的Python。
  2. 通过运行命令py -3.11-arm64 -m venv venv-arm64配置虚拟环境。
  3. 通过运行venv-arm64\Scripts\activate.bat激活虚拟环境。
  4. 通过运行py -3.11-arm64 -m pip install -r requirements.txt安装依赖。
  5. 使用cd Main-app进入主应用程序目录。
  6. 最后,输入-3.11-arm64 main.py运行应用程序。

另一种方法

虽然本系列教程使用CMake进行构建和DLL移植,但也可以使用MSBuild实现类似的结果。对于MSBuild项目,请使用控制台应用程序项目模板。

项目名称:Arm64EC.Porting.Vectors,位置:选择想要的任何位置,解决方案名称:Arm64EC.Porting.MSBuild。记得取消勾选“将解决方案和项目放在同一个目录中”。

创建项目后,将拥有一个名为Arm64EC.Porting.Vectors.cpp的单个源文件。将此文件重命名为Vectors.cpp。

在出现的窗口中,输入"Vectors.h"并点击“添加”。用以下内容替换Vectors.h文件的默认内容:

#pragma once #include <iostream> #include <chrono> using namespace std; extern "C" __declspec(dllexport) double performCalculations();

默认情况下,控制台应用程序模板会生成一个可执行文件,但需要将其更改为DLL。为此,请转到解决方案资源管理器,右键单击Arm64EC.Porting.Vectors项目。然后,选择“属性”。在打开的窗口中,从“配置类型”下拉列表中选择“动态库(.dll)”:

点击“确定”关闭“属性页”窗口。

现在,构建DLL,点击“构建/构建解决方案”。DLL应该位于\<平台 (x64或arm64)>\<配置 (Debug或Release)>文件夹中,可能会显示为Arm64EC.Porting.MSBuild\x64\Debug。

要将此库移植到Arm64EC,需要配置目标平台。为此,从下拉菜单中点击“配置管理器…”:

在“配置管理器”中,为Arm64EC创建新的解决方案平台:

然后,右键单击Arm64EC.Porting.Vectors文件并打开“属性”窗口。将配置类型更改为DLL,就像之前为x64配置所做的那样。配置好解决方案平台后,从构建目标下拉菜单中选择它并构建解决方案。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485