OpenHarmony开发者论坛

标题: Windows环境下使用OpenHarmony SDK对三方库进行交叉编译构建 [打印本页]

作者: 深开鸿_金昭    时间: 2024-11-21 10:13
标题: Windows环境下使用OpenHarmony SDK对三方库进行交叉编译构建
[md]# 一、make方式交叉编译构建

## 1.1 简介

make (GNU make) 是一个项目构建工具,用于方便地编译、链接多个源代码文件,自动决定哪些源文件需要重新编译,从而高效地构建自己地项目,普遍用于处理 c/c++ 项目,但也可以用于其他语言。具体来说,它读取 Makefile 中的规则和依赖项并根据这些规则来构建源代码。make 会检查源代码文件的时间戳,以确定哪些文件需要重新编译。它会自动解决依赖关系并按正确的顺序编译源文件。通过在终端中运行 make 命令,make 将根据 Makefile 中的指令逐步构建代码,生成最终的可执行程序或库文件。

对于采取 make 方式编译构建的三方库,其一般具有已经固定的 Makefile 。因此为了将其编译构建所用工具替换为 OpenHarmony SDK 所提供的工具,需要首先大致分析其 Makefile 内容,明确其编译工具的具体配置方式。

本章以三方库 bzip2 为例,分享如何在 Windows 环境下,以 make 方式,采用 OpenHarmony SDK 对其进行交叉编译构建。

## 1.2 编译前准备

### 1.2.1 准备 OpenHarmony SDK

可从 docs 仓中寻找指定 OpenHarmony 版本的[发布说明](https://gitee.com/openharmony/do ... zh-cn/release-notes) ,再从该版本发布说明中的“源码获取”章节,下载该版本对应的 OpenHarmony 标准系统 Public SDK 包(Windows/Linux)。

本文总结了常用版本的 Public SDK 包下载链接如下:

- **OpenHarmony 3.2 Release**:[Ohos_sdk_public 3.2.11.9](https://repo.huaweicloud.com/ope ... linux-public.tar.gz) (API Version 9)
- **OpenHarmony 4.0 Release**:[Ohos_sdk_public 4.0.10.13](https://repo.huaweicloud.com/ope ... linux-public.tar.gz) (API Version 10)
- **OpenHarmony 4.1 Release**:[Ohos_sdk_public 4.1.7.5](https://repo.huaweicloud.com/ope ... linux-public.tar.gz) (API Version 11)
- **OpenHarmony 5.0.0 Release**:[Ohos_sdk_public 5.0.0.71](https://repo.huaweicloud.com/ope ... linux-public.tar.gz) (API Version 12)

下载完成后将其解压,进入 SDK 的 windows 目录,解压编译构建 C/C++ 三方库所需的 native 工具。最后获得经解压的 native 文件夹,如下图所示:

![image-20241120145252794.png](https://forums-obs.openharmony.c ... g5p5z1cc8g1izvv.png "image-20241120145252794.png")

### 1.2.2 准备三方库源码

最新版的 bzip2 采取 CMake 编译构建方式,放弃了直接采用 make 方式的编译构建。因此采用 make 方式构建该三方库时,需要下载旧版本(1.0.6)的 bzip2 源码,可从[此处](https://sourceforge.net/p/bzip2/bzip2/ci/master/tree/)下载该版本:

![image-20241120145633616.png](https://forums-obs.openharmony.c ... ye9udyd96y9g8ev.png "image-20241120145633616.png")

下载后需将其解压至合适路径。

### 1.2.3 准备 Windows 编译环境

本文通过安装 Mingw-w64 所提供的 w64devkit ,为 Windows 环境下执行 make 命令提供支持。

[Mingw-w64](https://www.mingw-w64.org/) 是一个开源软件项目,旨在为 Windows 平台提供完整的开发环境。它是 MinGW(Minimalist GNU for Windows)的扩展版本,专注于支持 64 位架构,同时也兼容 32 位应用程序的开发。Mingw-w64 的核心功能是为 Windows 系统提供一个基于 GNU 工具链的编译器和开发工具套件,适合 C、C++ 以及其他编程语言的开发。

其中 [w64devkit](https://github.com/skeeto/w64devkit) 是适用于 x64(和x86)Windows 的便携式 C/C++ 开发工具包,提供了 Mingw-w64 GCC 、GNU Make 等多种工具。

本文利用 w64devkit 来配置 Windows 编译环境,具体步骤如下:

1. 下载 w64devkit 。从其 [Releases](https://github.com/skeeto/w64devkit/releases) 页可下载安装程序,如下图:

   ![image-20241120151552647.png](https://forums-obs.openharmony.c ... nvgtmurwgwmkpmt.png "image-20241120151552647.png")
2. 运行安装程序,将其解压至合适路径,如图:

   ![image-20241120151826204.png](https://forums-obs.openharmony.c ... gyaycg1gsaatccf.png "image-20241120151826204.png")
3. 将解压后所得 w64devkit 的 bin 目录添加至环境变量 Path 中,如图:

   ![image-20241120152102481.png](https://forums-obs.openharmony.c ... ry2jrjrl602g6jr.png "image-20241120152102481.png")
4. 测试安装是否成功。在 cmd 中输入命令 `mingw32-make -v`,查看 mingw32-make 的版本。若有类似下图的输出,则证明安装成功。

   ![image-20241120152258301.png](https://forums-obs.openharmony.c ... g5ih9hlggmtglht.png "image-20241120152258301.png")

## 1.3 编译&安装

1. 分析三方库原 Makefile 文件,以明确需修改的参数配置。

   - 编译命令配置

     ```makefile
     # To assist in cross-compiling
     CC=gcc
     AR=ar
     RANLIB=ranlib
     LDFLAGS=
     ```

     在该三方库原 Makefile 文件中,上述内容指定了编译时所用的编译器、创建静态库的工具、处理静态库中索引表的工具。在通过 OpenHarmony SDK 交叉编译构建时,需要将这三个变量指定为 OpenHarmony SDK 所提供的工具。
   - 安装路径配置

     ```makefile
     # Where you want it installed when you do 'make install'
     PREFIX=/usr/local
     ```

     在该三方库原 Makefile 文件中,上述内容指定了该三方库的安装路径默认为 Linux 系统下的 `/usr/local`目录。在 Windows 环境下进行交叉编译构建时,可以指定为自定义目录。
2. 配置交叉编译命令,执行 make 操作。在三方库目录中打开 cmd ,执行 mingw32-make 命令并配置上述参数。本文所执行的命令如下所示:

   ```cmd
   mingw32-make CC="D:/Public_sdk/11/ohos-sdk/windows/native/llvm/bin/clang.exe --target=aarch64-linux-ohos" AR=D:/Public_sdk/11/ohos-sdk/windows/native/llvm/bin/llvm-ar.exe RANDLIB=D:/Public_sdk/11/ohos-sdk/windows/native/llvm/bin/llvm-ranlib.exe libbz2.a bzip2 bzip2recover
   ```

   - 在上述命令中,`D:/Public_sdk/11/ohos-sdk/windows/native`为本文所用 OpenHarmony SDK 的 native 工具包路径,**读者应将其替换为自己的 native 工具包路径**。同时由于多数 Makefile 是用于在 Linux 环境下进行编译构建的,为保证兼容性,应将 Windows 系统路径中默认的分隔符 `\`改为 `/`。
   - **在 CC 配置中,除了配置交叉编译的 clang 外,还需要配置目标系统的 CPU 架构:**
     - 针对64位设备,应配置 `--target=aarch64-linux-ohos`
     - 针对32位设备,应配置 `--target=arm-linux-ohos`

   ---

   该命令的执行效果如图所示:

   ![image-20241120155723811.png](https://forums-obs.openharmony.c ... bsqggmgq56e0def.png "image-20241120155723811.png")

   在该三方库目录中,可以看到生成了 libbz2.a、bzip2 、 bzip2recover 以及 .o 文件:

   ![image-20241120155944330.png](https://forums-obs.openharmony.c ... 1p1xpenz0w3upv3.png "image-20241120155944330.png")
3. 配置安装路径,执行 make install 操作。执行 mingw32-make install 命令并配置参数。本文所执行的命令如下所示:

   ```cmd
   mingw32-make install PREFIX=D:/TestWork/bzip2_compiled
   ```

   - 在上述命令中,`D:/TestWork/bzip2_compiled`为自定义的三方库安装路径。

   ---

   该命令的执行效果如图所示:

   ![image-20241120160448116.png](https://forums-obs.openharmony.c ... 6g7vh26rg6l2mgg.png "image-20241120160448116.png")

   在所指定的安装目录中,可以看到生成了安装文件:

   ![image-20241120160633492.png](https://forums-obs.openharmony.c ... ov8q8kme8b8kd8q.png "image-20241120160633492.png")

# 二、CMake方式交叉编译构建

## 2.1 简介

CMake 是一个跨平台的构建工具,可以在 Linux、Windows 和 macOS等不同的操作系统上运行。 CMake 通过使用简单的脚本语言(CMakeLists.txt)描述项目的构建过程,定义项目的配置选项、依赖项和编译规则,从而生成适配于不同编译器和平台的构建文件,如Makefile或Visual Studio工程文件,能够简化复杂项目的配置和构建。

本章以三方库 cJSON 为例,分享如何在 Windows 环境下,以 CMake 方式,采用 OpenHarmony SDK 对其进行交叉编译构建。

## 2.2 编译前准备

### 2.2.1 准备 OpenHarmony SDK

见上文 1.2.1 部分,在此不再赘述。

### 2.2.2 准备三方库源码

本文以 cJSON v1.7.15 为例进行交叉编译构建。若已安装 git ,则可以在合适路径中打开 cmd ,通过 `git  clone`命令下载该版本的 cJSON :

```cmd
git clone https://github.com/DaveGamble/cJSON.git -b v1.7.15
```

也可访问 cJSON v1.7.15 Release 的[网址](https://github.com/DaveGamble/cJSON/releases/tag/v1.7.15)下载源码并解压至合适路径。

### 2.2.3 准备 Windows 编译环境

本文依赖 Mingw-w64 中 w64devkit 包所提供的 mingw32-make.exe 作为 make 工具进行编译构建,其安装及配置方式见上文 1.2.3 部分,在此不再赘述。

除此之外,由于本文采用 OpenHarmony SDK 所提供的 CMake工具,因此无需再安装 CMake。

## 2.3 编译&安装

1. 新建编译目录。使用 CMake 方式编译构建时,会自动生成 Makefile 等文件,为了不污染源码目录文件,本文在三方库目录下新建一个 build 目录,以存储 CMake 生成的编译配置文件。如图:

   ![image-20241120172403845.png](https://forums-obs.openharmony.c ... jrduiidrqijjron.png "image-20241120172403845.png")
2. 配置交叉编译参数,生成 Makefile 。进入 build 目录,在其中打开 cmd ,本文所执行的命令如下所示:

   ```cmd
   D:/Public_sdk/11/ohos-sdk/windows/native/build-tools/cmake/bin/cmake.exe -G "MinGW Makefiles" -DCMAKE_SH="CMAKE_SH-NOTFOUND" -DCMAKE_TOOLCHAIN_FILE=D:/Public_sdk/11/ohos-sdk/windows/native/build/cmake/ohos.toolchain.cmake -DCMAKE_INSTALL_PREFIX=D:/TestWork/cJSON_compiled -DOHOS_ARCH=arm64-v8a .. -L
   ```

   - 在上述命令中,`D:/Public_sdk/11/ohos-sdk/windows/native`为本文所用 OpenHarmony SDK 的 native 工具包路径,**读者应将其替换为自己的 native 工具包路径**。同时由于多数 Makefile 是用于在 Linux 环境下进行编译构建的,为保证兼容性,应将 Windows 系统路径中默认的分隔符 `\`改为 `/`。
   - 上述命令的详细说明如下:
     - `D:/Public_sdk/11/ohos-sdk/windows/native/build-tools/cmake/bin/cmake.exe`:指定所使用的 CMake 可执行文件路径,**必须设置成 OpenHarmony SDK 所提供的 CMake 文件**
     - 参数 `-G "MinGW Makefiles"`:指定生成器类型,使 CMake 生成用于 mingw32-make 的 Makefile ,以适应 Windows 环境
     - 参数 `-DCMAKE_SH="CMAKE_SH-NOTFOUND"`:避免环境变量路径内包含 sh.exe 而导致的 CMake Error ,以适应 Windows 环境
     - 参数 `-DCMAKE_TOOLCHAIN_FILE`:指定交叉编译工具链文件路径,**必须设置成 OpenHarmony SDK 工具链中的配置文件**
     - 参数 `-DCMAKE_INSTALL_PREFIX`:指定三方库经编译后的安装路径,可设置为自定义的安装路径
     - **参数 `-DOHOS_ARCH`:指定目标系统的 CPU 架构:**
       - 针对64位设备,应配置为 `-DOHOS_ARCH=arm64-v8a`
       - 针对32位设备,应配置 `-DOHOS_ARCH=armeabi-v7a`
     - 参数 `..`:指定要编译的三方库源代码路径,本文中为 build 目录的父级目录
     - 参数 `-L`:显示 CMake 执行过程中所有缓存变量的列表及其值

   ---

   该命令的执行效果如图所示:

   ![image-20241120175729425.png](https://forums-obs.openharmony.c ... tvozkjuv2voio0f.png "image-20241120175729425.png")

   在 build 目录中,可以看到生成了 Makefile 文件:

   ![image-20241120175830499.png](https://forums-obs.openharmony.c ... xdgzp14pk51amz8.png "image-20241120175830499.png")
3. 执行 make 操作,进行编译。执行如下命令:

   ```cmd
   mingw32-make
   ```

   ---

   该命令的执行效果如图所示:

   ![image-20241120180051286.png](https://forums-obs.openharmony.c ... sc0qwgoxuvvsrrl.png "image-20241120180051286.png")

   在 build 目录中,可以看到生成了 .so 文件:

   ![image-20241120180140738.png](https://forums-obs.openharmony.c ... 2xq7730onq22dh0.png "image-20241120180140738.png")
4. 执行 make install 操作,进行安装。执行如下命令:

   ```cmd
   mingw32-make install
   ```

   ---

   该命令的执行效果如图所示:

   ![image-20241120180412470.png](https://forums-obs.openharmony.c ... sqsqqsvjjwbyw3i.png "image-20241120180412470.png")

   在所指定的安装目录中,可以看到生成了安装文件:

   ![image-20241120180431350.png](https://forums-obs.openharmony.c ... y0ttemmtath6b4d.png "image-20241120180431350.png")

# 三、参考链接

- Linux环境下make方式的交叉编译构建:[docs/make_portting.md · OpenHarmony-SIG/tpc_c_cplusplus - Gitee.com](https://gitee.com/openharmony-si ... cs/make_portting.md)
- Linux环境下CMake方式的交叉编译构建:[docs/cmake_portting.md · OpenHarmony-SIG/tpc_c_cplusplus - Gitee.com](https://gitee.com/openharmony-si ... s/cmake_portting.md)
[/md]
作者: 太阳照常升起    时间: 2025-4-9 20:19
请问编出来的gzip可以直接上板子运行吗




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5