在Windows 11上,Arm64EC技术允许开发者加速现有的x64应用程序或依赖项。本文将指导如何将C/C++DLL移植到Arm64平台,使用的技术包括CMake和MSBuild。将通过一个使用Python和Qt快速构建UI应用程序的示例,展示如何将底层的计算密集型工作放在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位于相应的文件夹中:
将这些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文件安装所有依赖。
应用程序启动后,可以看到它像以前一样工作。但是,请注意,计算时间始终为0.00,这是因为使用x64进程加载了DLL。要将它们作为Arm64加载,需要使用Arm64的Python。然而,在撰写本文时,PySide 6尚未通过pip提供Arm64版本。一旦它变得可用,就可以完全测试移植。
虽然本系列教程使用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配置所做的那样。配置好解决方案平台后,从构建目标下拉菜单中选择它并构建解决方案。