65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Arm64EC 将应用程序移植到 Arm64 - 系列(第 2 部分)

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2023 年 9 月 13 日

CPOL

5分钟阅读

viewsIcon

5617

在本系列的第一部分中,您学习了如何使用现有的或新的 C/C++ 动态链接库 (DLL) 来提供高效的计算,并使用 Python 和 Qt 快速构建基于 UI 的应用程序。在本文中,您将学习如何使用 Arm64EC 将每个 DLL 移植到 Arm64。

正如 微软官方文档 所解释的,Arm64EC 可帮助您在 Windows 11 on Arm 上加速现有的 x64 应用程序或依赖项。要使用 Arm64EC,您只需适当配置构建目标即可。因此,您的整个应用程序可以混合 x64 依赖项和 Arm64。

微软还发布了一篇关于使用 Arm64EC 将 C/C++ 应用程序移植到 Arm64 的文章。但是,那篇文章使用的是一个简单的应用程序,它只执行两个数字相加的操作。本文演示了一个更高级的示例:您使用 Python 的 Qt 绑定 (PySide 6) 来创建主应用程序,并带有两个底层的 C/C++ DLL。这种架构模仿了使用 Python 和 Qt 进行快速 UI 原型设计以及使用 DLL 进行计算密集型工作的典型场景。使用 Python 应用程序的原因是为了演示一种构建 UI 来支持 C/C++ DLL 依赖项的替代方法。但是,您仍然可以使用基于 Qt 的 C/C++ UI,如之前所示。

移植 Arm64 DLL

要遵循本教程,请确保您具备以下先决条件(您已在系列的第一篇教程中安装过):

  • Visual Studio 2022
  • Arm64 构建工具。这些工具通过 Visual Studio Installer 安装,位于Individual Components > MSVC v143 > VS 2022 C++ ARM64 build tools。请注意,这是默认选中的组件。
  • 在您的计算机上安装了Python。本次演示使用 Python 版本 3.11.3。与我们之前的一篇文章一样,您需要安装适用于 x64 和 Arm64 的 Python。

有关教程的更详细视图,请参阅完整的项目代码

使用 Arm64EC 移植到 Arm64

使用 Arm64EC 将 DLL 移植到 Arm64 有两种方法。具体使用哪种取决于您使用 MSBuild 还是 CMake 项目。在上一篇文章中,您使用了 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 并构建应用程序。

由于您为两个 DLL 使用的是同一个 CMake 文件,因此您会在 out/build/arm64EC-release 文件夹下找到两个已编译的 DLL。每个 DLL 位于相应的文件夹中:FiltersVectors。复制这些 DLL,并在 Main-app 中创建一个名为 Main-app/Dependencies/Arm64EC-release 的新文件夹,如下所示:

  • ARM64EC.Porting/out/build/arm64EC-release/Vectors/Vectors.dll
    to
    ARM64EC.Porting/Main-app/Dependencies/Arm64EC-release/Vectors.dll
  • ARM64EC.Porting/out/build/arm64EC-release/Filters/Filters.dll
    to
    ARM64EC.Porting/Main-app/Dependencies/Arm64EC-release/Filters.dll

要在主应用程序中使用这些 DLL,请更新 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 上提供。一旦可用,您就可以完全测试移植。

以下是在 Windows 上使用 Arm64 虚拟环境启动 Python 应用程序的详细步骤:

  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

请记住取消选中 Place solution and project in the same directory(将解决方案和项目放在同一个目录中)。

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

上一篇文章中的文件内容替换 Vectors.cpp 的默认内容。

然后,打开 Solution Explorer(解决方案资源管理器),右键单击 Headers(头文件),然后选择 Add/New Item…(添加/新建项…)。

在出现的窗口中,键入 "Vectors.h" 并单击 Add(添加)。

用以下内容替换 Vectors.h 文件的默认内容:

#pragma once

#include <iostream>
#include <chrono>

using namespace std;

extern "C" __declspec(dllexport) double performCalculations();

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

单击 OK(确定)关闭 Property Pages(属性页)窗口。

现在,通过单击 Build/Build solution(生成/生成解决方案)来构建 DLL。DLL 应位于 \<platform (x64 or arm64)>\<configuration (Debug or Release)> 文件夹中,该文件夹可能显示为 Arm64EC.Porting.MSBuild\x64\Debug

要将此库移植到 Arm64EC,您需要配置目标平台。为此,请从下拉菜单中单击 Configuration Manager…(配置管理器…)。

Configuration Manager(配置管理器)中,为 Arm64EC 创建新的解决方案平台。

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

编译后的 DLL 将在 ARM64EC 子文件夹下可用。然后,您可以像使用使用 CMake 构建的 DLL 一样,在 Main-app 中使用它。

要为第二个 DLL 使用 MSBuild,您的操作与此类似。

结论

本文演示了如何使用 Arm64EC 将 C/C++ DLL 移植到 Arm64。它向您展示了如何使用 CMake 和 MSBuild 项目。您还学习了如何使用 ctypes 在 Python 应用程序中处理 DLL。这些信息可以帮助您快速构建 UI,并将计算密集型工作保留在单独的 DLL 中。然后,您可以为 Arm64 构建这些 DLL,并将它们与现有的 x64 依赖项混合使用。

在 Windows 11 上试用 Arm64EC,并使用 Windows Dev Kit 2023,以经济高效的方式在运行 Windows 的 Arm64 设备上测试您的应用程序。

© . All rights reserved.