• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# OpenHarmony 交叉编译功能
2
3## 简介
4
5OpenHarmony 交叉编译功能使开发者能够简单快速地调用 OpenHarmony SDK 中的 native 工具链工具,将三方库源码编译为 OpenHarmony 二进制文件和头文件。
6
7用户只需简单操作,通过 vscode 交互界面确认编译方式、目标系统架构、 OpenHarmony SDK 中 native 工具链位置等信息后,本功能即可自动生成并拼接编译命令,送入终端执行编译与安装操作。对于所执行的具体命令,本功能还提供了清晰的配置文件,用户可根据实际情况对其进行灵活修改,以满足各种需求。
8
9## 约束
10
11**系统**:建议 Ubuntu 20.04 或 Windows 10
12
13**依赖版本**:VS Code 1.62.0
14
15------
16
17若在 Windows 10 系统下使用本功能,则还需首先准备编译环境。本功能依赖于 ming&w-w64 项目中 w64devkit 包所提供的 GCC 编译器来执行 make 操作,需下载并安装 w64devkit 工具:
18
191. 下载 w64devkit 包。在链接 [Releases · skeeto/w64devkit](https://github.com/skeeto/w64devkit/releases) 中选择合适版本并下载;
20
212. 安装 w64devkit 至合适路径,并将其安装目录下的 bin 目录加入系统环境变量 Path 中;
22
233. 在 cmd 中执行命令`ming&w32-make -v`以验证安装状态。若有如下输出则证明安装成功:
24
25   ```cmd
26   Microsoft Windows [版本 10.0.19045.5247]
27   (c) Microsoft Corporation。保留所有权利。
28
29   C:\Users\Administrator>ming&w32-make -v
30   GNU Make 4.4.1
31   Built for x86_64-w64-ming&w32
32   Copyright (C) 1988-2023 Free Software Foundation, Inc.
33   License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
34   This is free software: you are free to change and redistribute it.
35   There is NO WARRANTY, to the extent permitted by law.
36   ```
37
38
39
40## 使用方法
41
42### 初次使用
43
44初次使用本功能时,使用流程为:
45
461. 在 VSCode 资源管理器中,右键要编译的三方库源码目录,选择 **[OpenHarmony 交叉编译]** 选项以启动本功能:(以 cJSON 为例)
47
48   ![](https://gitee.com/openharmony/napi_generator/raw/master/src/vscode_plugin/images/ohCrossCompile_menu.png)
49
502. 本功能启动后,会自动检测所选目录中是否存在 Makefile 或 CMakeLists.txt 文件。若检测到只有二者其一存在,则会自动使用对应编译方式;若二者均存在,则需要用户指定具体编译方式:(以 cmake 方式为例)
51
52   ![](https://gitee.com/openharmony/napi_generator/raw/master/src/vscode_plugin/images/ohCrossCompile_toolPick.png)
53
543. 根据实际需求选择目标系统架构,可多选。若需编译64位二进制文件,则应勾选 **[arm64-v8a]** 架构;若需编译32位二进制文件,则应勾选 **[armeabi-v7a]** 架构。(以全选为例)
55
56   ![](https://gitee.com/openharmony/napi_generator/raw/master/src/vscode_plugin/images/ohCrossCompile_archPick.png)
57
584. 选择 OpenHarmony SDK 的来源是本地还是在线下载:
59
60   ![](https://gitee.com/openharmony/napi_generator/raw/master/src/vscode_plugin/images/ohCrossCompile_sourcePick.png)
61
62   - 若选择使用本地已有的 SDK ,则需选择本地 OpenHarmony SDK 目录下 native 文件夹所在路径:
63
64     ![](https://gitee.com/openharmony/napi_generator/raw/master/src/vscode_plugin/images/ohCrossCompile_sourcePick_selectNative.png)
65
66   - 若选择在线下载,则需选择所要下载 SDK 的具体版本:
67
68     ![](https://gitee.com/openharmony/napi_generator/raw/master/src/vscode_plugin/images/ohCrossCompile_versionPick.png)
69
705. 等待插件运行。若选择本地 SDK ,插件会自动拼接编译及安装命令,调起终端执行;若选择在线下载 SDK ,插件会在 SDK 下载解压完成后自动拼接编译及安装命令,调起终端执行。(以选择本地 SDK 为例)
71
72   ![](https://gitee.com/openharmony/napi_generator/raw/master/src/vscode_plugin/images/ohCrossCompile_compilation.png)
73
746. 查看安装文件。交叉编译完成后,所得二进制文件和头文件会自动安装在 `[三方库目录]/ohCrossCompile/[目标系统架构]/installed` 路径下:
75
76   ![](https://gitee.com/openharmony/napi_generator/raw/master/src/vscode_plugin/images/ohCrossCompile_installedFiles.png)
77
78### 后续使用
79
80后续再次使用本功能时,在 VSCode 资源管理器中右键要编译的三方库源码目录,选择 **[OpenHarmony 交叉编译]** 选项即可按以往配置直接开始交叉编译过程:
81
82![](https://gitee.com/openharmony/napi_generator/raw/master/src/vscode_plugin/images/ohCrossCompile_menu_2.png)
83
84### 高级配置
85
86本功能的各有关配置存储在 `[三方库目录]/ohCrossCompile/config.json` 文件中,用户若有更高级的自定义需求,可以通过修改该配置文件来实现。如上例中,所生成的配置文件内容为:
87
88```json
89{
90    "settings": {
91        "compileTool": "cmake",
92        "nativePath": "D:/Public_sdk/11/ohos-sdk/windows/native",
93        "thirdPartyPath": "d:/TestWork/VariousTests/cJSON",
94        "ohArchitecture": [
95            "arm64-v8a",
96            "armeabi-v7a"
97        ]
98    },
99    "actions": [
100        {
101            "compileTool": "cmake",
102            "ohArchitecture": "arm64-v8a",
103            "nativePath": "D:/Public_sdk/11/ohos-sdk/windows/native",
104            "thirdPartyPath": "d:/TestWork/VariousTests/cJSON",
105            "installPath": "d:/TestWork/VariousTests/cJSON/ohCrossCompile/arm64-v8a/installed",
106            "cwd": "d:/TestWork/VariousTests/cJSON/ohCrossCompile/arm64-v8a",
107            "commands": [
108                {
109                    "command": "cd d:/TestWork/VariousTests/cJSON/ohCrossCompile/arm64-v8a",
110                    "arguments": []
111                },
112                {
113                    "command": "D:/Public_sdk/11/ohos-sdk/windows/native/build-tools/cmake/bin/cmake.exe",
114                    "arguments": [
115                        "-G \"ming&w Makefiles\"",
116                        "-DCMAKE_SH=\"CMAKE_SH-NOTFOUND\"",
117                        "-DCMAKE_TOOLCHAIN_FILE=D:/Public_sdk/11/ohos-sdk/windows/native/build/cmake/ohos.toolchain.cmake",
118                        "-DCMAKE_INSTALL_PREFIX=d:/TestWork/VariousTests/cJSON/ohCrossCompile/arm64-v8a/installed",
119                        "-DOHOS_ARCH=arm64-v8a",
120                        "../..",
121                        "-L"
122                    ]
123                },
124                {
125                    "command": "ming&w32-make",
126                    "arguments": []
127                },
128                {
129                    "command": "ming&w32-make install",
130                    "arguments": []
131                }
132            ]
133        },
134        {
135            "compileTool": "cmake",
136            "ohArchitecture": "armeabi-v7a",
137            "nativePath": "D:/Public_sdk/11/ohos-sdk/windows/native",
138            "thirdPartyPath": "d:/TestWork/VariousTests/cJSON",
139            "installPath": "d:/TestWork/VariousTests/cJSON/ohCrossCompile/armeabi-v7a/installed",
140            "cwd": "d:/TestWork/VariousTests/cJSON/ohCrossCompile/armeabi-v7a",
141            "commands": [
142                {
143                    "command": "cd d:/TestWork/VariousTests/cJSON/ohCrossCompile/armeabi-v7a",
144                    "arguments": []
145                },
146                {
147                    "command": "D:/Public_sdk/11/ohos-sdk/windows/native/build-tools/cmake/bin/cmake.exe",
148                    "arguments": [
149                        "-G \"ming&w Makefiles\"",
150                        "-DCMAKE_SH=\"CMAKE_SH-NOTFOUND\"",
151                        "-DCMAKE_TOOLCHAIN_FILE=D:/Public_sdk/11/ohos-sdk/windows/native/build/cmake/ohos.toolchain.cmake",
152                        "-DCMAKE_INSTALL_PREFIX=d:/TestWork/VariousTests/cJSON/ohCrossCompile/armeabi-v7a/installed",
153                        "-DOHOS_ARCH=armeabi-v7a",
154                        "../..",
155                        "-L"
156                    ]
157                },
158                {
159                    "command": "ming&w32-make",
160                    "arguments": []
161                },
162                {
163                    "command": "ming&w32-make install",
164                    "arguments": []
165                }
166            ]
167        }
168    ]
169}
170```
171
172其中各字段含义为:
173
174- `settings`字段用以存储自动检测出的及与用户交互所获得的配置信息,包括编译方式`compileTool`、OpenHarmony SDK 中 native 工具目录位置`nativePath`、交叉编译的三方库目录位置`thirdPartyPath`、交叉编译的目标系统架构`ohArchitecture`。
175- `actions`字段用以存储交叉编译所执行的各动作(如编译64位三方库、编译32位三方库)。每个动作对象中的`installPath`字段存储了本次交叉编译动作的安装目录;`cwd`字段存储了在终端执行交叉编译命令时所处的路径;`commands`字段存储了各条按序执行的交叉编译命令,其下一级对应于各条命令的`arguments`字段则存储了该命令的附加参数。
176
177当用户使用本功能时,插件会按序读取配置文件信息:
178
1791. 若`actions`字段为空,则会根据`settings`字段中信息,生成各动作对象的默认内容;
1802. 若`actions`字段下,各动作对象中的`commands`字段为空,则会根据该动作对象`compileTool`、`ohArchitecture`、`nativePath`、`installPath`、`cwd`字段中信息,生成该动作对象的`commands`字段默认内容;
1813. 最后根据各动作对象中的`commands`字段内容,拼接交叉编译命令,并送入终端执行。
182
183在具体业务场景下,用户若有自定义需求,则既可以直接修改`commands`字段下的具体命令,也可以在修改上一级信息后删除`actions`字段或`commands`字段中的内容以使其重新生成,从而实现对不同实际需求的灵活适应。
184
185## 测试
186
187交叉编译完成后,用户可在 OpenHarmony 设备上自行测试所得二进制文件的可用性。
188
189具体测试过程可参考链接 [make方式交叉编译后测试](https://gitee.com/openharmony-sig/tpc_c_cplusplus/blob/master/docs/make_portting.md#测试) 或 [cmake方式交叉编译后测试](https://gitee.com/openharmony-sig/tpc_c_cplusplus/blob/master/docs/cmake_portting.md#测试)