积分26 / 贡献0

提问0答案被采纳0文章3

[经验分享] Windows环境下使用OpenHarmony SDK对三方库进行交叉编译构建

深开鸿_金昭 显示全部楼层 发表于 6 小时前

一、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 版本的发布说明 ,再从该版本发布说明中的“源码获取”章节,下载该版本对应的 OpenHarmony 标准系统 Public SDK 包(Windows/Linux)。

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

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

image-20241120145252794.png

1.2.2 准备三方库源码

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

image-20241120145633616.png

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

1.2.3 准备 Windows 编译环境

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

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

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

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

  1. 下载 w64devkit 。从其 Releases 页可下载安装程序,如下图:

    image-20241120151552647.png

  2. 运行安装程序,将其解压至合适路径,如图:

    image-20241120151826204.png

  3. 将解压后所得 w64devkit 的 bin 目录添加至环境变量 Path 中,如图:

    image-20241120152102481.png

  4. 测试安装是否成功。在 cmd 中输入命令 mingw32-make -v,查看 mingw32-make 的版本。若有类似下图的输出,则证明安装成功。

    image-20241120152258301.png

1.3 编译&安装

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

    • 编译命令配置

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

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

    • 安装路径配置

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

      在该三方库原 Makefile 文件中,上述内容指定了该三方库的安装路径默认为 Linux 系统下的 /usr/local目录。在 Windows 环境下进行交叉编译构建时,可以指定为自定义目录。

  2. 配置交叉编译命令,执行 make 操作。在三方库目录中打开 cmd ,执行 mingw32-make 命令并配置上述参数。本文所执行的命令如下所示:

    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

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

    image-20241120155944330.png

  3. 配置安装路径,执行 make install 操作。执行 mingw32-make install 命令并配置参数。本文所执行的命令如下所示:

    mingw32-make install PREFIX=D:/TestWork/bzip2_compiled
    • 在上述命令中,D:/TestWork/bzip2_compiled为自定义的三方库安装路径。

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

    image-20241120160448116.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 :

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

也可访问 cJSON v1.7.15 Release 的网址下载源码并解压至合适路径。

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

  2. 配置交叉编译参数,生成 Makefile 。进入 build 目录,在其中打开 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

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

    image-20241120175830499.png

  3. 执行 make 操作,进行编译。执行如下命令:

    mingw32-make

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

    image-20241120180051286.png

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

    image-20241120180140738.png

  4. 执行 make install 操作,进行安装。执行如下命令:

    mingw32-make install

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

    image-20241120180412470.png

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

    image-20241120180431350.png

三、参考链接

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部