diff options
Diffstat (limited to 'code/projects/ohos_compile.html')
-rw-r--r-- | code/projects/ohos_compile.html | 332 |
1 files changed, 332 insertions, 0 deletions
diff --git a/code/projects/ohos_compile.html b/code/projects/ohos_compile.html new file mode 100644 index 0000000..bf72035 --- /dev/null +++ b/code/projects/ohos_compile.html | |||
@@ -0,0 +1,332 @@ | |||
1 | <!DOCTYPE html> | ||
2 | <html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang=""> | ||
3 | |||
4 | <head> | ||
5 | <meta charset="utf-8" /> | ||
6 | <meta name="generator" content="pandoc" /> | ||
7 | <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> | ||
8 | <title>OpenHarmony 3.2 编译</title> | ||
9 | <link rel="stylesheet" href="https://www.qin-juan-ge-zhu.top/common/CSS/pandoc.css"> | ||
10 | <script type="text/javascript" src="https://www.qin-juan-ge-zhu.top/common/js/myhighlight.js"></script> | ||
11 | <script type="text/javascript" src="https://www.qin-juan-ge-zhu.top/common/script4code.js"></script> | ||
12 | </head> | ||
13 | |||
14 | <body> | ||
15 | <div class="pandoc"> | ||
16 | <div class="main"> | ||
17 | <header id="title-block-header"> | ||
18 | <p class="title">OpenHarmony 3.2 编译</p> | ||
19 | </header> | ||
20 | <!-- 鸿蒙开发环境搭建 --> | ||
21 | <p>[toc]</p> | ||
22 | <blockquote> | ||
23 | <p>本次编译环境搭建参考了以下博客:</p> | ||
24 | <ul> | ||
25 | <li><a | ||
26 | href="https://gitee.com/hihope_iot/docs/blob/master/HiHope_DAYU200/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA%E7%BC%96%E8%AF%91%E6%8C%87%E5%8D%97.md">HiHope_DAYU200/开发环境搭建编译指南</a> | ||
27 | </li> | ||
28 | <li><a href="https://juejin.cn/post/7257553293889634363">基于 Ubuntu 20.04 配置 OpenHarmony 开发环境</a> | ||
29 | </li> | ||
30 | <li><a | ||
31 | href="https://blog.csdn.net/jwq1220/article/details/127303546?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127303546%22%2C%22source%22%3A%222401_82617925%22%7D&fromshare=blogdetail">OpenHarmony | ||
32 | 源码编译步骤(基于 3.2 beta3)</a></li> | ||
33 | <li><a | ||
34 | href="https://unix.stackexchange.com/questions/616392/failed-load-btf-from-vmlinux-unknown-error-2make-makefile1162-vmlinu">FAILED: | ||
35 | load BTF from vmlinux: Unknown error -2</a></li> | ||
36 | </ul> | ||
37 | </blockquote> | ||
38 | <h1 id="环境与依赖">环境与依赖</h1> | ||
39 | <h2 id="硬件环境">硬件环境</h2> | ||
40 | <p>编译过程使用的是 | ||
41 | <code>Ubuntu</code>,经测试,<code>Ubuntu 22.04 LTS</code>/<code>Ubuntu 20.04 LTS</code>/<code>Ubuntu 18.04 LTS</code> | ||
42 | 均可用。</p> | ||
43 | <p>网上的大多数博客里没有对编译的硬件限制作出说明,现根据我们的情况,给出一个大概的范围:</p> | ||
44 | <ul> | ||
45 | <li><strong>内存必须在 10G 以上</strong>,我使用的是 13G,编译成功(8G 时编译失败了,下文会说明)</li> | ||
46 | <li><strong>磁盘 160G 或以上</strong> | ||
47 | <ul> | ||
48 | <li>源码大小就 36G 左右了</li> | ||
49 | <li>大量的依赖会占据数十 G 的空间</li> | ||
50 | <li>我用的是 160G 磁盘,编译成功,但基本不剩什么空间了</li> | ||
51 | </ul> | ||
52 | </li> | ||
53 | <li>注意所需要的<strong>ohos 的版本、cpu 版本、位数等信息</strong></li> | ||
54 | </ul> | ||
55 | <p>这里我用的是 VMWare+Ubuntu22.04 虚拟机。</p> | ||
56 | <h2 id="软件包依赖">软件包依赖</h2> | ||
57 | <p>安装依赖在博客中都有讲,但<strong>少了一部分依赖项</strong>,我因而将所有必要的依赖项整理到一个脚本里了:</p> | ||
58 | <pre><code>#!/bin/bash | ||
59 | set -e # 一旦出错立刻停止执行,不会执行后续指令 | ||
60 | |||
61 | # 更新软件源 | ||
62 | sudo apt update | ||
63 | sudo apt upgrade | ||
64 | |||
65 | # 官方博客说明的依赖项 | ||
66 | sudo apt install binutils git git-lfs gnupg flex \ | ||
67 | bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib \ | ||
68 | libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache \ | ||
69 | libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin \ | ||
70 | python3-pip ruby libtinfo-dev libtinfo5 \ | ||
71 | |||
72 | # 官方博客未说明,但安装过程中报缺失的依赖项 | ||
73 | sudo apt install openjdk-8-jdk libssl-dev libelf-dev default-jdk \ | ||
74 | genext2fs u-boot-tools mtd-utils scons gcc-arm-none-eabi \ | ||
75 | liblz4-tool | ||
76 | |||
77 | # 别的博客说明的依赖项 | ||
78 | sudo apt install device-tree-compiler lib32stdc++6 lib32z1 libncurses5-dev lib32ncurses6 | ||
79 | |||
80 | # 检查是否存在python3,如不存在则为之安装 | ||
81 | if ! [ -x "$(command -v python3)" ]; then | ||
82 | sudo apt install python3 | ||
83 | fi | ||
84 | # 是否有python,如没有则建立软连接到python3的位置 | ||
85 | if ! [ -x "$(command -v python)" ]; then | ||
86 | sudo ln -s $(which python3) /usr/bin/python | ||
87 | fi</code></pre> | ||
88 | <p>这里需要注意的是,<strong>如果安装过程中出现报错,在修改之后,必须重新执行整个脚本</strong>,因为在 apt 发现找不到某个软件包之后,后续的包与命令都不会执行。</p> | ||
89 | <h1 id="配置-git">配置 git</h1> | ||
90 | <h2 id="git-基础设置">git 基础设置</h2> | ||
91 | <p>在上边我们已经下载了本次所需要的<code>git</code>与<code>git-lfs</code>,接下来我们需要对<code>git</code>进行基础设置。</p> | ||
92 | <pre><code># 设置用户名与密码,新用户必做 | ||
93 | # 这里的用户名与密码只是一个写在git提交记录中的标识,可以与gitee/github账号无关 | ||
94 | git config --global user.name "yourname" | ||
95 | git config --global user.email "your-email-address" | ||
96 | # git凭证缓存,必做 | ||
97 | git config --global credential.helper store | ||
98 | # git默认的文本编辑器是nano,我一般喜欢改为vim,选做 | ||
99 | git config --global core.editor vim</code></pre> | ||
100 | <h2 id="gitee-帐户">gitee 帐户</h2> | ||
101 | <p>由于 OpenHarmony 的源码托管在 gitee 上,所以我们需要在 gitee 上注册一个帐户。注册的方法在此不复赘述。</p> | ||
102 | <p>本次编译过程中,我们并不需要提交代码,因而可以仅通过 http 方式从 gitee 下载源码——如果是这样的话,<strong>就不需要进行 git 与 gitee | ||
103 | 关联</strong>;如果想要提交代码,那么需要将本地的 git 与 gitee 账号关联起来,具体操作如下:</p> | ||
104 | <pre><code># 在本地执行 | ||
105 | ssh-keygen -t rsa -C "your-email-address"</code></pre> | ||
106 | <p>命令执行后,每次需要输入都直接回车,<strong>连续有三个回车</strong>,执行就会结束,ssh | ||
107 | 密钥对的公钥和私钥分别保存在<code>~/.ssh/id_rsa.pub</code>和<code>~/.ssh/id_rsa</code>中。</p> | ||
108 | <p>在 gitee 用户的设置界面,将公钥<code>id_rsa.pub</code>的内容复制到 gitee 的 SSH 公钥中,保存即可。</p> | ||
109 | <p>此时,我们就可以通过 ssh 的方式与 gitee 进行交互、也可以免密提交代码了。</p> | ||
110 | <h1 id="系统源码编译">系统源码编译</h1> | ||
111 | <h2 id="配置-repo-工具">配置 repo 工具</h2> | ||
112 | <p><strong>注意:前两条命令需要以 root 身份执行!!!</strong></p> | ||
113 | <pre><code># 以下两条命令需要以root身份执行 | ||
114 | sudo -s | ||
115 | curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/repo | ||
116 | chmod a+x /usr/local/bin/repo | ||
117 | exit | ||
118 | |||
119 | # 这条普通身份也可以 | ||
120 | pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests</code></pre> | ||
121 | <p>之所以前两条命令需要以 root 身份而不能是 sudo,是因为<code>/usr/local/bin</code>是一个只有 root 用户才有写权限的目录,而 sudo 命令虽然是以 root | ||
122 | 身份执行,但<strong>重定向时候 sudo 用的也是当前用户身份</strong>,权限不足,自然报错。(<strong>如果是管道,那么 sudo | ||
123 | 也是只对当前命令有效,而不是对后续的整个管道有效。</strong>)</p> | ||
124 | <h2 id="获取源码">获取源码</h2> | ||
125 | <p>通过 repo + https/ssh 下载:</p> | ||
126 | <pre><code># 通过http下载,这里需要注意你需要的ohos的版本 | ||
127 | repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify | ||
128 | # 如果需要的是特定分支,-b后边改成对应分支名 | ||
129 | # 如果是tag,-b后的参数比较复杂,要在网页上提前确定好需要的tag名字, | ||
130 | # 如下载的是tag为OpenHarmony-v3.2-Release的版本,命令如下: | ||
131 | # repo init -u https://gitee.com/openharmony/manifest -b refs/tags/OpenHarmony-v3.2-Release --no-repo-verify | ||
132 | # 除使用https外,也可以通过ssh下载 | ||
133 | # repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify | ||
134 | |||
135 | repo sync -c | ||
136 | repo forall -c 'git lfs pull'</code></pre> | ||
137 | <h2 id="prebuilts-与编译">prebuilts 与编译</h2> | ||
138 | <pre><code># 先在源码根目录下执行脚本,安装编译器及二进制工具 | ||
139 | bash build/prebuilts_download.sh | ||
140 | # 再执行如下命令进行版本编译 | ||
141 | # 注意:默认编译的时候,目标cpu是32位,即使为64位cpu也无法使用64位功能 | ||
142 | sudo ./build.sh --product-name rk3568 --ccache | ||
143 | # 如果是64位cpu,需要加上--target-cpu=arm64 | ||
144 | sudo ./build.sh --product-name rk3568 --ccache --target-cpu=arm64</code></pre> | ||
145 | <h2 id="编译完成">编译完成</h2> | ||
146 | <p>编译所生成的文件都归档在 out 目录下,结果镜像输出在源码根目录下的<code>out/rk3568/packages/phone/images</code>目录下。</p> | ||
147 | <p>自此源码编译成功,即可进行镜像烧录。</p> | ||
148 | <h1 id="编译报错解决记录">编译报错解决记录</h1> | ||
149 | <p>以下记录编译过程中出现的一些出现过的报错、坑点和注意事项,以为后来者鉴。</p> | ||
150 | <h2 id="ssh-下载源码报错">ssh 下载源码报错</h2> | ||
151 | <p>在使用 ssh | ||
152 | 下载时,第一步<code>repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify</code>,报错: | ||
153 | </p> | ||
154 | <pre><code>Warning: Permanently added 'gitee.com,180.76.198.77' (ECDSA) to the list of known hosts.</code></pre> | ||
155 | <p>经检查,发现 gitee 邮箱设置与公钥中邮箱存在差异,修改 gitee 邮箱设置后成功。</p> | ||
156 | <h2 id="设备磁盘空间不足">设备磁盘空间不足</h2> | ||
157 | <p>编译过程中异常终止,并显示“设备上没有空间”。</p> | ||
158 | <p><strong>解决方法:</strong></p> | ||
159 | <ul> | ||
160 | <li>在<code>VMWare</code>中扩大磁盘空间 | ||
161 | <ul> | ||
162 | <li><strong>关闭虚拟机</strong></li> | ||
163 | <li>在<code>VMWare</code>上方菜单栏中依次选择<code>虚拟机->设置->硬件->硬盘->扩展</code>,然后输入新的磁盘大小</li> | ||
164 | <li>点击确定后会提示,说需要在虚拟机中扩展分区,才能使用新的磁盘空间</li> | ||
165 | </ul> | ||
166 | </li> | ||
167 | <li>打开虚拟机,并扩展分区 | ||
168 | <ul> | ||
169 | <li>在命令行中输入<code>sudo apt install gparted</code>,安装<code>gparted</code>分区工具</li> | ||
170 | <li>打开该工具,选择需要扩展的分区(一般为挂载到根目录<code>/</code>的那个分区),点击<code>Resize/Move</code>,然后拖动分区大小,点击<code>Resize/Move</code>,再点击<code>Apply</code>,等待分区扩展完成 | ||
171 | </li> | ||
172 | </ul> | ||
173 | </li> | ||
174 | </ul> | ||
175 | <p>如果在虚拟机里用 gparted 进行分区扩展时,弹窗说“分区被挂载为只读,无法调整大小”。此时我们需要:</p> | ||
176 | <ul> | ||
177 | <li>右键该分区,查看挂载到什么位置了。一般是挂载到<code>/</code>与<code>/var/snap/firefox/common/host-hunspell</code></li> | ||
178 | <li>执行以下命令:</li> | ||
179 | </ul> | ||
180 | <pre><code># 对于这个设备挂载到的每一个分区,都执行以下命令,以此类推 | ||
181 | sudo mount -o remount -rw / | ||
182 | sudo mount -o remount -rw /var/snap/firefox/common/host-hunspell</code></pre> | ||
183 | <p>而后在 gparted 中点击<code>gparted->刷新设备</code>,即可进行分区扩展。</p> | ||
184 | <h2 id="一个奇怪的报错gn-failed">一个奇怪的报错——<code>GN Failed</code></h2> | ||
185 | <p>这是一个很奇怪的报错,我们尚未找到真正的原因所在,只知道如何暂时地绕过去。</p> | ||
186 | <h3 id="问题描述与复现">问题描述与复现</h3> | ||
187 | <p>问题复现方法为在编译过程中,执行以下命令:</p> | ||
188 | <pre><code>./build.sh --product-name rk3568 --ccache</code></pre> | ||
189 | <p>该命令是指导书中写的编译命令,但执行时候会出错;<strong>与上文所述的经确认无误的编译命令不同在于没加<code>sudo</code></strong>。</p> | ||
190 | <p>如果按照指导书的命令来,不出意外编译将会报错: <img src="https://www.qin-juan-ge-zhu.top/images/code/ohos_gn_fail_1.png" /> | ||
191 | <img src="https://www.qin-juan-ge-zhu.top/images/code/ohos_gn_fail_2.png" /></p> | ||
192 | <p><strong>以下是该问题的具体描述:</strong></p> | ||
193 | <p><code>build.log</code>如下:</p> | ||
194 | <pre><code>Set cache size limit to 100.0 GB | ||
195 | [OHOS INFO] loader args:['platforms_config_file="/home/axiomer/桌面/out/preloader/ohos-sdk/platforms.build"', 'subsystem_config_file="/home/axiomer/桌面/out/preloader/ohos-sdk/subsystem_config.json"', 'example_subsystem_file=""', 'exclusion_modules_config_file="/home/axiomer/桌面/out/preloader/ohos-sdk/exclusion_modules.json"', 'source_root_dir="/home/axiomer/桌面/"', 'gn_root_out_dir="out/sdk"', 'build_platform_name=phone', 'build_xts=False', 'load_test_config=False', 'target_os=ohos', 'target_cpu=arm64', 'os_level=standard', "ignore_api_check=['xts', 'common', 'testfwk']", 'scalable_build=False', 'skip_partlist_check=False'] | ||
196 | [OHOS INFO] Excuting gn command: /home/axiomer/桌面/prebuilts/build-tools/linux-x86/bin/gn gen --args="product_name=\"ohos-sdk\" product_path=\"/home/axiomer/桌面/productdefine/common/products\" product_config_path=\"/home/axiomer/桌面/productdefine/common/products\" device_name=\"sdk\" device_path=\"/home/axiomer/桌面/device/board/ohos/sdk\" device_company=\"ohos\" device_config_path=\"/home/axiomer/桌面/device/board/ohos/sdk\" target_cpu=\"arm64\" is_standard_system=true ohos_build_compiler_specified=\"\" ohos_build_time=1707374188101 ohos_build_datetime=\"2024-02-08 22:36:28\" build_ohos_sdk=true build_ohos_ndk=true ohos_build_enable_ccache=true ohos_build_type=\"debug\" device_type=\"default\" build_variant=\"root\" use_thin_lto=false ndk_platform=\"linux\" sdk_for_hap_build=true skip_generate_module_list_file=true enable_lto_O0=true archive_ndk=false enable_ndk_doxygen=false use_cfi=false sdk_check_flag=false sdk_platform=\"linux\" root_perf_main=\"main\" runtime_mode=\"release\"" --args=product_name="ohos-sdk" product_path="/home/axiomer/桌面/productdefine/common/products" product_config_path="/home/axiomer/桌面/productdefine/common/products" device_name="sdk" device_path="/home/axiomer/桌面/device/board/ohos/sdk" device_company="ohos" device_config_path="/home/axiomer/桌面/device/board/ohos/sdk" target_cpu="arm64" is_standard_system=true ohos_build_compiler_specified="" ohos_build_time=1707374188101 ohos_build_datetime="2024-02-08 22:36:28" build_ohos_sdk=true build_ohos_ndk=true ohos_build_enable_ccache=true ohos_build_type="debug" device_type="default" build_variant="root" use_thin_lto=false ndk_platform="linux" sdk_for_hap_build=true skip_generate_module_list_file=true enable_lto_O0=true archive_ndk=false enable_ndk_doxygen=false use_cfi=false sdk_check_flag=false sdk_platform="linux" root_perf_main="main" runtime_mode="release" /home/axiomer/桌面/out/sdk | ||
197 | ERROR at //build/config/BUILDCONFIG.gn:92:15: Could not read file. | ||
198 | read_file("${preloader_output_dir}/build_config.json", "json") | ||
199 | ^------------------------------------------ | ||
200 | I resolved this to "/home/axiomer/桌面/out/preloader/build_config.json". | ||
201 | root_out_dir=//out/sdk | ||
202 | root_build_dir=//out/sdk | ||
203 | root_gen_dir=//out/sdk/gen | ||
204 | current_toolchain= | ||
205 | [91m[OHOS ERROR][0m Traceback (most recent call last): | ||
206 | [91m[OHOS ERROR][0m File "/home/axiomer/桌面/build/hb/containers/status.py", line 47, in wrapper | ||
207 | [91m[OHOS ERROR][0m return func(*args, **kwargs) | ||
208 | [91m[OHOS ERROR][0m File "/home/axiomer/桌面/build/hb/services/gn.py", line 197, in _execute_gn_gen_cmd | ||
209 | [91m[OHOS ERROR][0m SystemUtil.exec_command(gn_gen_cmd, self.config.log_path) | ||
210 | [91m[OHOS ERROR][0m File "/home/axiomer/桌面/build/hb/util/system_util.py", line 64, in exec_command | ||
211 | [91m[OHOS ERROR][0m LogUtil.get_failed_log(log_path) | ||
212 | [91m[OHOS ERROR][0m File "/home/axiomer/桌面/build/hb/util/log_util.py", line 191, in get_failed_log | ||
213 | [91m[OHOS ERROR][0m LogUtil.get_gn_failed_log(log_path) | ||
214 | [91m[OHOS ERROR][0m File "/home/axiomer/桌面/build/hb/util/log_util.py", line 137, in get_gn_failed_log | ||
215 | [91m[OHOS ERROR][0m raise OHOSException( | ||
216 | [91m[OHOS ERROR][0m exceptions.ohos_exception.OHOSException: GN Failed! Please check error in /home/axiomer/桌面/out/sdk/error.log, and for more build information in /home/axiomer/桌面/out/sdk/build.log | ||
217 | [91m[OHOS ERROR][0m | ||
218 | [91m[OHOS ERROR][0m Code: 3000 | ||
219 | [91m[OHOS ERROR][0m | ||
220 | [91m[OHOS ERROR][0m Reason: GN Failed! Please check error in /home/axiomer/桌面/out/sdk/error.log, and for more build information in /home/axiomer/桌面/out/sdk/build.log | ||
221 | [91m[OHOS ERROR][0m | ||
222 | [91m[OHOS ERROR][0m Error Type: UNKNOWN | ||
223 | [91m[OHOS ERROR][0m | ||
224 | [91m[OHOS ERROR][0m Description: An unknown error occurred while executing 'gn gen'. | ||
225 | [91m[OHOS ERROR][0m | ||
226 | [91m[OHOS ERROR][0m Solution: There is no solution available. You can check the 'gn_error.log' in the output directory for more information | ||
227 | [91m[OHOS ERROR][0m</code></pre> | ||
228 | <p>报错信息中提到<code>ERROR at //build/config/BUILDCONFIG.gn:92:15: Could not read file.</code>,但是经过检查文件,<strong>存在名为<code>BUILDCONFIG.gn</code>的文件,且开放可读权限</strong>;但报错信息中显示无法读该文件。 | ||
229 | </p> | ||
230 | <h3 id="失败尝试">失败尝试</h3> | ||
231 | <p>在此,我进行了许多尝试,但都无一例外失败了;以下是我的尝试点,或许会有帮助:</p> | ||
232 | <ul> | ||
233 | <li>根据<a href="">一个相似提问</a>,对相关依赖进行安装,失败了: <img | ||
234 | src="https://www.qin-juan-ge-zhu.top/images/code/ohos_gn_fail_dependencies.png" /></li> | ||
235 | <li>根据报错信息,在编译命令中添加<code>--no-prebuilt-sdk</code>选项对 ohos-sdk 的构建进行跳过,依然失败</li> | ||
236 | </ul> | ||
237 | <p>尝试未果 T^T</p> | ||
238 | <h3 id="最终方案">最终方案</h3> | ||
239 | <p>报错信息如下所示:</p> | ||
240 | <p>在上述报错信息中提到<code>Permission denied</code>,即权限不够;于是尝试添加<code>sudo</code>,居然跑通了!!!!</p> | ||
241 | <p>在指导书的编译指令<code>./build.sh --product-name rk3568 --ccache</code>前添加权限设置<code>sudo</code>,即指令更改为:</p> | ||
242 | <pre><code>sudo ./build.sh --product-name rk3568 --ccache</code></pre> | ||
243 | <p>不知道为什么,编译过程中始终没有向我提出权限要求,但是不加<code>sudo</code>开权限就是跑不通,很奇怪 @ _ <span class="citation" | ||
244 | data-cites="也许是">@也许是</span> OHOS 内敛不好意思申请权限呢……</p> | ||
245 | <h2 id="另一个奇怪的报错failed-load-btf-from-vmlinux-unknown-error--22"> | ||
246 | 另一个奇怪的报错——<code>FAILED: load BTF from vmlinux: Unknown error -22</code></h2> | ||
247 | <p>关于这个报错,当时的错误日志、运行日志、聊天截图均已丢失,但时日不久,记忆还算清楚,加上这个报错困扰了我好些天,因而必须记录。</p> | ||
248 | <h3 id="问题简要描述">问题简要描述</h3> | ||
249 | <p>正常按照<code>sudo ./build.sh --product-name rk3568 --ccache</code>编译时,报错,主要报错信息如下:</p> | ||
250 | <pre><code>die__process_unit: DW_TAG_label (0xa) @ <0x3adc> not handled! | ||
251 | die__process_unit: DW_TAG_label (0xa) @ <0x3bdc> not handled! | ||
252 | die__process_unit: DW_TAG_label (0xa) @ <0x3bef> not handled! | ||
253 | die__process_unit: DW_TAG_label (0xa) @ <0x3ce5> not handled! | ||
254 | die__process_unit: DW_TAG_label (0xa) @ <0x3cff> not handled! | ||
255 | die__process_unit: DW_TAG_label (0xa) @ <0x3d19> not handled! | ||
256 | Killed | ||
257 | LD .tmp_vmlinux.kallsyms1 | ||
258 | KSYMS .tmp_vmlinux.kallsyms1.S | ||
259 | AS .tmp_vmlinux.kallsyms1.S | ||
260 | LD .tmp_vmlinux.kallsyms2 | ||
261 | KSYMS .tmp_vmlinux.kallsyms2.S | ||
262 | AS .tmp_vmlinux.kallsyms2.S | ||
263 | LD ymlinux | ||
264 | BTEIDS vmlinux | ||
265 | FAILED: load BTF from vmlinux: Unknown error -22make[2]: *** [/home/player/harmony/out/kernel/src_tmp/linux-5.19/ | ||
266 | Makefile:1225: vmlinux]错误 255 | ||
267 | make[1]: *** [arch/arm64/Makefile:208: rk3568-toybrick-x0-linux.img]错误2 | ||
268 | make[1]: 离开目录"/home/player/harmony/out/kernel/OBJ/linux-5.10" | ||
269 | make: *** [Makefile:192:__sub-make]错误 2</code></pre> | ||
270 | <p>可以看到,报错的关键点在于<code>FAILED: load BTF from vmlinux: Unknown error -22</code>这里。查看 Makefile 对应报错位置:</p> | ||
271 | <pre><code>vmlinux: scripts/link-vmlinux.sh autoksyms_recursive $(vmlinux-deps) FORCE | ||
272 | +$(call if_changed,link-vmlinux) | ||
273 | |||
274 | targets := vmlinux</code></pre> | ||
275 | <h3 id="解释">解释</h3> | ||
276 | <ul> | ||
277 | <li>这段 makefile 的实际功能是链接一个虚拟 linux | ||
278 | <ul> | ||
279 | <li>通过目录位置,我们可以合理猜测,这里是在进行<strong>linux 内核编译,但失败了</strong></li> | ||
280 | </ul> | ||
281 | </li> | ||
282 | <li>报错中说的<code>BTF</code>则是数据格式 | ||
283 | <ul> | ||
284 | <li>一般出现<code>load BTF from xxx</code>错误时,是由于系统不一致导致的(也就是不同系统 BTF 格式不一样,出现了识别错误)</li> | ||
285 | </ul> | ||
286 | </li> | ||
287 | <li>最重要的是,<strong>Unknown error -22 这个报错码,搜不到任何信息!</strong></li> | ||
288 | </ul> | ||
289 | <p>因而,我尝试了重装系统,将我的 Ubuntu22.04 重装为 20.04,但最后<strong>仍然会出现这个错误</strong>,足以证明不是系统差异导致的。</p> | ||
290 | <h3 id="解决">解决</h3> | ||
291 | <p>最终,我在<a | ||
292 | href="https://unix.stackexchange.com/questions/616392/failed-load-btf-from-vmlinux-unknown-error-2make-makefile1162-vmlinu">第二篇参考博客</a>里找到了答案:编译较新的 | ||
293 | Linux 内核时,至少需要 10G+内存,而我一贯把虚拟机内存只设置为 8G。</p> | ||
294 | <p>令人好奇的是,为什么需要这么大内存?按理来说在虚拟内存空间里,物理内存不够的时候,不应该是由 OS 出面进行内存与磁盘的页面调度吗?我认为,可能是在编译过程中,其他进程占据一部分内存,而这里在链接一个虚拟 | ||
295 | linux 文件,可能文件体积过大而尚未创建完成,所有页面一直驻留在内存中,导致内存崩溃。</p> | ||
296 | <p>总而言之,言而总之,在<code>VMware->虚拟机->设置->硬件->内存</code>中,把内存扩大,就可以完美解决该问题。经我的测试,内存 13.2G(主机总内存 16G | ||
297 | 时候推荐的最大虚拟机内存)是能编译完成的,编译时长 6h。最终解决。</p> | ||
298 | <h1 id="ohos-的-ndk">ohos 的 NDK</h1> | ||
299 | <p>NDK 编译方式比较简单,在源码根目录下执行如下命令:</p> | ||
300 | <pre><code># 安装依赖 | ||
301 | ./build/build_scripts/env_setup.sh | ||
302 | |||
303 | # 执行完上述命令后记得执行source ~/.bashrc或者重启终端 | ||
304 | source ~/.bashrc | ||
305 | |||
306 | # 安装编译SDK需要的依赖包(编译镜像的时候是不依赖这些包的) | ||
307 | sudo apt-get install libxcursor-dev libxrandr-dev libxinerama-dev | ||
308 | |||
309 | ./build.sh --product-name ohos-sdk --ccache --build-target ohos_ndk</code></pre> | ||
310 | <p>编译出来的 NDK 在<code>out/sdk/packages/ohos-sdk/linux/native</code>下。当然同时也有 windows 版本的 NDK,你猜在哪里?</p> | ||
311 | <p>将编译出来的 NDK 的 zip 解压到你想要的目录下,然后将该目录添加到环境变量中,即可使用。</p> | ||
312 | <p>注意,NDK 包提供的交叉编译工具是 cmake 和 ninja,编译器是 clang 和 clang++,并没有我们熟悉的 gcc/g++和 make。除此之外,NDK | ||
313 | 还未我们提供编译所需的全套服务,如编译工具链配置文件<code>ohos.toolchain.cmake</code>、头文件、库文件等。快说,谢谢 ohos~</p> | ||
314 | <h1 id="完结撒花">完结撒花</h1> | ||
315 | <p>本次鸿蒙开发环境的搭建过程可谓一波三折,总结几个最大的坑点,或许可以作为编译的经验罢:</p> | ||
316 | <ul> | ||
317 | <li><strong>有报错,试试添加权限!</strong></li> | ||
318 | <li>贫贱程序猿百事哀,编译 OpenHarmony 系统需要<strong>足够的硬件配置</strong> | ||
319 | <ul> | ||
320 | <li>内存 10G+</li> | ||
321 | <li>磁盘 160G+</li> | ||
322 | </ul> | ||
323 | </li> | ||
324 | </ul> | ||
325 | <p>不说了,抓紧攒点钱开学升级电脑配置要紧……磁盘快炸了……</p> | ||
326 | <p class="time">2024.2.12,甲辰年正月初三<br>2024.4.24改</p> | ||
327 | <script src="https://www.qin-juan-ge-zhu.top/common/js/comment.js"></script> | ||
328 | </div> | ||
329 | </div> | ||
330 | </body> | ||
331 | |||
332 | </html> \ No newline at end of file | ||