diff options
Diffstat (limited to 'code/projects')
-rw-r--r-- | code/projects/godo.html | 26 | ||||
-rw-r--r-- | code/projects/lcm_compile.html | 24 | ||||
-rw-r--r-- | code/projects/ohos_compile.html | 60 |
3 files changed, 57 insertions, 53 deletions
diff --git a/code/projects/godo.html b/code/projects/godo.html index ed64840..c967797 100644 --- a/code/projects/godo.html +++ b/code/projects/godo.html | |||
@@ -6,15 +6,16 @@ | |||
6 | <meta name="generator" content="pandoc" /> | 6 | <meta name="generator" content="pandoc" /> |
7 | <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> | 7 | <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> |
8 | <title>godo知识总结</title> | 8 | <title>godo知识总结</title> |
9 | <link rel="stylesheet" href="https://test.qin-juan-ge-zhu.top/common/CSS/pandoc.css"> | 9 | <link rel="stylesheet" href="https://www.qin-juan-ge-zhu.top/common/CSS/pandoc.css"> |
10 | <script type="text/javascript" src="https://test.qin-juan-ge-zhu.top/common/js/myhighlight.js"></script> | 10 | <script type="text/javascript" src="https://www.qin-juan-ge-zhu.top/common/script4code.js"></script> |
11 | <script type="text/javascript" src="https://test.qin-juan-ge-zhu.top/common/script4code.js"></script> | ||
12 | </head> | 11 | </head> |
13 | 12 | ||
14 | <body> | 13 | <body> |
15 | <div class="pandoc"> | 14 | <div class="pandoc"> |
16 | <div class="main"> | 15 | <div class="main"> |
17 | <p class="title">godo知识总结</p> | 16 | <header id="title-block-header"> |
17 | <p class="title">godo知识总结</p> | ||
18 | </header> | ||
18 | <h1 id="背景说明">背景说明</h1> | 19 | <h1 id="背景说明">背景说明</h1> |
19 | <p>本文档对<a href="https://git.qin-juan-ge-zhu.top/godo">godo</a>编写过程中新了解到的技术、遇到的问题进行简要说明,以备所需。</p> | 20 | <p>本文档对<a href="https://git.qin-juan-ge-zhu.top/godo">godo</a>编写过程中新了解到的技术、遇到的问题进行简要说明,以备所需。</p> |
20 | <h1 id="系统调用">系统调用</h1> | 21 | <h1 id="系统调用">系统调用</h1> |
@@ -31,7 +32,7 @@ | |||
31 | <li>在 C 语言中直接调用同名函数,但大概率经过了 glibc 的封装</li> | 32 | <li>在 C 语言中直接调用同名函数,但大概率经过了 glibc 的封装</li> |
32 | <li>手动封装。如下:</li> | 33 | <li>手动封装。如下:</li> |
33 | </ul> | 34 | </ul> |
34 | <pre><code>#include <stdio.h> | 35 | <pre><code class="language-c">#include <stdio.h> |
35 | #include <sys/syscall.h> | 36 | #include <sys/syscall.h> |
36 | #include <sys/types.h> | 37 | #include <sys/types.h> |
37 | #include <sys/wait.h> | 38 | #include <sys/wait.h> |
@@ -50,7 +51,7 @@ int main(){ | |||
50 | return 0; | 51 | return 0; |
51 | }</code></pre> | 52 | }</code></pre> |
52 | <p>这种封装方式与经常被用来当作 os 教材的 Linux-0.11/0.12 有所区别。Linux-0.11 环境上,unistd.h 大致如下:</p> | 53 | <p>这种封装方式与经常被用来当作 os 教材的 Linux-0.11/0.12 有所区别。Linux-0.11 环境上,unistd.h 大致如下:</p> |
53 | <pre><code>#ifndef _UNISTD_H | 54 | <pre><code class="language-c">#ifndef _UNISTD_H |
54 | #define _UNISTD_H | 55 | #define _UNISTD_H |
55 | 56 | ||
56 | ... | 57 | ... |
@@ -102,7 +103,7 @@ return -1; \ | |||
102 | 103 | ||
103 | #endif</code></pre> | 104 | #endif</code></pre> |
104 | <p>可以看到,Linux-0.11 上,封装的一般方法为:</p> | 105 | <p>可以看到,Linux-0.11 上,封装的一般方法为:</p> |
105 | <pre><code>#define __LIBRARY__ // 一定要在unistd.h之前 | 106 | <pre><code class="language-c">#define __LIBRARY__ // 一定要在unistd.h之前 |
106 | #include <unistd.h> | 107 | #include <unistd.h> |
107 | #include <stdio.h> | 108 | #include <stdio.h> |
108 | 109 | ||
@@ -124,13 +125,13 @@ int main() { | |||
124 | tasks 表里的一个 task,而每个 task 才具有独一无二的 id</strong>。</p> | 125 | tasks 表里的一个 task,而每个 task 才具有独一无二的 id</strong>。</p> |
125 | <h3 id="常见系统调用的分析">常见系统调用的分析</h3> | 126 | <h3 id="常见系统调用的分析">常见系统调用的分析</h3> |
126 | <p>看看这个:</p> | 127 | <p>看看这个:</p> |
127 | <pre><code>extern int pthread_create (pthread_t *__restrict __newthread, | 128 | <pre><code class="language-c">extern int pthread_create (pthread_t *__restrict __newthread, |
128 | const pthread_attr_t *__restrict __attr, | 129 | const pthread_attr_t *__restrict __attr, |
129 | void *(*__start_routine) (void *), | 130 | void *(*__start_routine) (void *), |
130 | void *__restrict __arg) __THROWNL __nonnull ((1, 3));</code></pre> | 131 | void *__restrict __arg) __THROWNL __nonnull ((1, 3));</code></pre> |
131 | <p><code>pthread_create</code>函数的第一个参数,就是一个 pthread_t 类型的指针,处理后将 task 的 id 写到指针指向的区域。</p> | 132 | <p><code>pthread_create</code>函数的第一个参数,就是一个 pthread_t 类型的指针,处理后将 task 的 id 写到指针指向的区域。</p> |
132 | <p>让我们来看一段简单的代码:</p> | 133 | <p>让我们来看一段简单的代码:</p> |
133 | <pre><code>// test.c | 134 | <pre><code class="language-c">// test.c |
134 | #include <stdio.h> | 135 | #include <stdio.h> |
135 | #include <pthread.h> | 136 | #include <pthread.h> |
136 | #include <sys/syscall.h> | 137 | #include <sys/syscall.h> |
@@ -160,7 +161,7 @@ int main() { | |||
160 | return 0; | 161 | return 0; |
161 | }</code></pre> | 162 | }</code></pre> |
162 | <p>当我们使用<code>strace ./test</code>来查看上述代码时,会发现情况如下:</p> | 163 | <p>当我们使用<code>strace ./test</code>来查看上述代码时,会发现情况如下:</p> |
163 | <pre><code>clone(child_stack=0x7f3dd28bbff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f3dd28bc9d0, tls=0x7f3dd28bc700, child_tidptr=0x7f3dd28bc9d0) = 21756 | 164 | <pre><code class="language-c">clone(child_stack=0x7f3dd28bbff0, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7f3dd28bc9d0, tls=0x7f3dd28bc700, child_tidptr=0x7f3dd28bc9d0) = 21756 |
164 | write(1, "main: thread 139903502108416\n", 29) = 29 | 165 | write(1, "main: thread 139903502108416\n", 29) = 29 |
165 | clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f3dd308e9d0) = 21757 | 166 | clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f3dd308e9d0) = 21757 |
166 | --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=21757, si_uid=1000, si_status=0, si_utime=0, si_stime=0} --- | 167 | --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=21757, si_uid=1000, si_status=0, si_utime=0, si_stime=0} --- |
@@ -173,7 +174,7 @@ exit_group(0) = ? | |||
173 | <p>从这样的输出里,我们可以清晰地看到,<strong>无论是<code>pthread_create</code>还是<code>fork</code>(指库函数),本质上都是封装了<code>clone</code>系统调用,即使 | 174 | <p>从这样的输出里,我们可以清晰地看到,<strong>无论是<code>pthread_create</code>还是<code>fork</code>(指库函数),本质上都是封装了<code>clone</code>系统调用,即使 |
174 | Linux 本身提供了专门的 fork 系统调用。</strong>也许这是 glibc 和 Linux 都想在添加功能的基础上保证代码兼容性?花开两朵各表一枝了属于是。</p> | 175 | Linux 本身提供了专门的 fork 系统调用。</strong>也许这是 glibc 和 Linux 都想在添加功能的基础上保证代码兼容性?花开两朵各表一枝了属于是。</p> |
175 | <p>这一结论也可以从 glibc 的代码中得到验证:</p> | 176 | <p>这一结论也可以从 glibc 的代码中得到验证:</p> |
176 | <pre><code>// 文件 glibc-2.18/nptl/sysdeps/unix/sysv/linux/pt-fork.c | 177 | <pre><code class="language-c">// 文件 glibc-2.18/nptl/sysdeps/unix/sysv/linux/pt-fork.c |
177 | pid_t | 178 | pid_t |
178 | __fork (void) | 179 | __fork (void) |
179 | { | 180 | { |
@@ -354,7 +355,8 @@ PSEUDO_END (syscall)</code></pre> | |||
354 | <li>gcc 技术大全</li> | 355 | <li>gcc 技术大全</li> |
355 | <li>黑客调试技术大全</li> | 356 | <li>黑客调试技术大全</li> |
356 | </ul> | 357 | </ul> |
357 | <script src="https://test.qin-juan-ge-zhu.top/common/js/comment.js"></script> | 358 | <p class="time">2024.8</p> |
359 | <script src="https://www.qin-juan-ge-zhu.top/common/js/comment.js"></script> | ||
358 | </div> | 360 | </div> |
359 | </div> | 361 | </div> |
360 | </body> | 362 | </body> |
diff --git a/code/projects/lcm_compile.html b/code/projects/lcm_compile.html index d889b58..7aa390a 100644 --- a/code/projects/lcm_compile.html +++ b/code/projects/lcm_compile.html | |||
@@ -7,14 +7,15 @@ | |||
7 | <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> | 7 | <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> |
8 | <title>LCM 交叉编译</title> | 8 | <title>LCM 交叉编译</title> |
9 | <link rel="stylesheet" href="https://www.qin-juan-ge-zhu.top/common/CSS/pandoc.css"> | 9 | <link rel="stylesheet" href="https://www.qin-juan-ge-zhu.top/common/CSS/pandoc.css"> |
10 | <script type="text/javascript" src="https://hl.qin-juan-ge-zhu.top/myset/myhighlight.js"></script> | ||
11 | <script type="text/javascript" src="https://www.qin-juan-ge-zhu.top/common/script4code.js"></script> | 10 | <script type="text/javascript" src="https://www.qin-juan-ge-zhu.top/common/script4code.js"></script> |
12 | </head> | 11 | </head> |
13 | 12 | ||
14 | <body> | 13 | <body> |
15 | <div class="pandoc"> | 14 | <div class="pandoc"> |
16 | <div class="main"> | 15 | <div class="main"> |
17 | <p class="title">LCM 交叉编译</p> | 16 | <header id="title-block-header"> |
17 | <p class="title">LCM 交叉编译</p> | ||
18 | </header> | ||
18 | <!-- 编译集成lcm模块 --> | 19 | <!-- 编译集成lcm模块 --> |
19 | <h1 id="lcm-简介">LCM 简介</h1> | 20 | <h1 id="lcm-简介">LCM 简介</h1> |
20 | <p>LCM(Lightweight Communications and | 21 | <p>LCM(Lightweight Communications and |
@@ -28,13 +29,13 @@ | |||
28 | <li><a href="https://zhuanlan.zhihu.com/p/621943685">一篇博客</a></li> | 29 | <li><a href="https://zhuanlan.zhihu.com/p/621943685">一篇博客</a></li> |
29 | </ul> | 30 | </ul> |
30 | <h1 id="依赖项安装">依赖项安装</h1> | 31 | <h1 id="依赖项安装">依赖项安装</h1> |
31 | <pre><code>sudo apt update | 32 | <pre><code class="language-bash">sudo apt update |
32 | sudo apt upgrade | 33 | sudo apt upgrade |
33 | sudo apt install build-essential cmake libglib2.0-dev | 34 | sudo apt install build-essential cmake libglib2.0-dev |
34 | sudo apt install openjdk-8-jdk # lcm仅支持jdk8</code></pre> | 35 | sudo apt install openjdk-8-jdk # lcm仅支持jdk8</code></pre> |
35 | <h1 id="x86-的-lcm">x86 的 lcm</h1> | 36 | <h1 id="x86-的-lcm">x86 的 lcm</h1> |
36 | <p>如果我们仅仅需要 x86 架构的 lcm,执行下列命令即可:</p> | 37 | <p>如果我们仅仅需要 x86 架构的 lcm,执行下列命令即可:</p> |
37 | <pre><code>git clone https://github.com/lcm-proj/lcm | 38 | <pre><code class="language-bash">git clone https://github.com/lcm-proj/lcm |
38 | cd lcm | 39 | cd lcm |
39 | mkdir build && cd build | 40 | mkdir build && cd build |
40 | cmake .. | 41 | cmake .. |
@@ -48,14 +49,14 @@ sudo make install</code></pre> | |||
48 | <p>lcm-spy 是 LCM 配套的数据可视化工具。 可以通过 lcm-spy 监视 lcm 数据发送频率、数据量、数据结构,甚至实时画图。 如果安装了 JAVA,则 lcm-spy 会连同 LCM 一同被安装。 | 49 | <p>lcm-spy 是 LCM 配套的数据可视化工具。 可以通过 lcm-spy 监视 lcm 数据发送频率、数据量、数据结构,甚至实时画图。 如果安装了 JAVA,则 lcm-spy 会连同 LCM 一同被安装。 |
49 | </p> | 50 | </p> |
50 | <p>启动 lcm-spy:</p> | 51 | <p>启动 lcm-spy:</p> |
51 | <pre><code>export CLASSPATH=${your lcm-type class path} | 52 | <pre><code class="language-bash">export CLASSPATH=${your lcm-type class path} |
52 | lcm-spy</code></pre> | 53 | lcm-spy</code></pre> |
53 | <h1 id="交叉编译">交叉编译</h1> | 54 | <h1 id="交叉编译">交叉编译</h1> |
54 | <p>既然 lcm 用的是 cmake,何不交叉编译到 OHOS 里用呢?</p> | 55 | <p>既然 lcm 用的是 cmake,何不交叉编译到 OHOS 里用呢?</p> |
55 | <p>首先,我们可以设置一下 Native Development Kit(NDK)的路径:</p> | 56 | <p>首先,我们可以设置一下 Native Development Kit(NDK)的路径:</p> |
56 | <pre><code># 设置成自己的NDK工具目录 | 57 | <pre><code class="language-bash"># 设置成自己的NDK工具目录 |
57 | export OHOS_ROOT=~/app/native</code></pre> | 58 | export OHOS_ROOT=~/app/native</code></pre> |
58 | <pre><code>$OHOS_ROOT/build-tools/cmake/bin/cmake \ | 59 | <pre><code class="language-bash">$OHOS_ROOT/build-tools/cmake/bin/cmake \ |
59 | -DOHOS_STL=c++_shared \ | 60 | -DOHOS_STL=c++_shared \ |
60 | -DOHOS_ARCH=armv8-a \ | 61 | -DOHOS_ARCH=armv8-a \ |
61 | -DOHOS_PLATFORM=OHOS \ | 62 | -DOHOS_PLATFORM=OHOS \ |
@@ -66,7 +67,7 @@ export OHOS_ROOT=~/app/native</code></pre> | |||
66 | <p>解决方案自然是自己手动交叉编译<code>libglib2.0-dev</code>。</p> | 67 | <p>解决方案自然是自己手动交叉编译<code>libglib2.0-dev</code>。</p> |
67 | <h2 id="glib2.0-交叉编译">Glib2.0 交叉编译</h2> | 68 | <h2 id="glib2.0-交叉编译">Glib2.0 交叉编译</h2> |
68 | <p>从<a href="https://download.gnome.org/sources/glib/">官网</a>下载 glib-2.79.2 源码,解压后进入源码目录。</p> | 69 | <p>从<a href="https://download.gnome.org/sources/glib/">官网</a>下载 glib-2.79.2 源码,解压后进入源码目录。</p> |
69 | <pre><code>mkdir glib && cd glib | 70 | <pre><code class="language-bash">mkdir glib && cd glib |
70 | wget https://download.gnome.org/sources/glib/2.79/glib-2.79.2.tar.xz | 71 | wget https://download.gnome.org/sources/glib/2.79/glib-2.79.2.tar.xz |
71 | tar -xvf glib-2.79.2.tar.xz | 72 | tar -xvf glib-2.79.2.tar.xz |
72 | mkdir build</code></pre> | 73 | mkdir build</code></pre> |
@@ -78,7 +79,7 @@ mkdir build</code></pre> | |||
78 | <p>接着,参考博客<a | 79 | <p>接着,参考博客<a |
79 | href="https://t.csdnimg.cn/YfSJC">这篇博客</a>,撰写如下<kbd>meson_ohos.txt</kbd>(友情提醒,使用该文件时把<kbd>native</kbd>也就是 | 80 | href="https://t.csdnimg.cn/YfSJC">这篇博客</a>,撰写如下<kbd>meson_ohos.txt</kbd>(友情提醒,使用该文件时把<kbd>native</kbd>也就是 |
80 | NDK 的路径修改为自己的路径、源平台与目标平台按需修改):</p> | 81 | NDK 的路径修改为自己的路径、源平台与目标平台按需修改):</p> |
81 | <pre><code>[binaries] | 82 | <pre><code class="language-meson">[binaries] |
82 | c = '$OHOS_ROOT/llvm/bin/aarch64-unknown-linux-ohos-clang' | 83 | c = '$OHOS_ROOT/llvm/bin/aarch64-unknown-linux-ohos-clang' |
83 | cpp = '$OHOS_ROOT/llvm/bin/aarch64-unknown-linux-ohos-clang++' | 84 | cpp = '$OHOS_ROOT/llvm/bin/aarch64-unknown-linux-ohos-clang++' |
84 | ar = '$OHOS_ROOT/llvm/bin/llvm-ar' | 85 | ar = '$OHOS_ROOT/llvm/bin/llvm-ar' |
@@ -102,15 +103,16 @@ cpu_family = 'aarch64' | |||
102 | cpu = 'armv8a' | 103 | cpu = 'armv8a' |
103 | endian = 'little'</code></pre> | 104 | endian = 'little'</code></pre> |
104 | <p>将该文件放置在<kbd>glib-2.79.2</kbd>源码目录下,而后在<kbd>build</kbd>目录下执行以下命令:</p> | 105 | <p>将该文件放置在<kbd>glib-2.79.2</kbd>源码目录下,而后在<kbd>build</kbd>目录下执行以下命令:</p> |
105 | <pre><code>meson --cross-file=../glib-2.79.2/meson_ohos.txt .. | 106 | <pre><code class="language-bash">meson --cross-file=../glib-2.79.2/meson_ohos.txt .. |
106 | ninja</code></pre> | 107 | ninja</code></pre> |
107 | <p>编译完成,正确地安装 glib2 到交叉编译工具链中(???),之后我们回到 lcm 的源码目录,重新执行 cmake 命令:</p> | 108 | <p>编译完成,正确地安装 glib2 到交叉编译工具链中(???),之后我们回到 lcm 的源码目录,重新执行 cmake 命令:</p> |
108 | <pre><code>$OHOS_ROOT/build-tools/cmake/bin/cmake \ | 109 | <pre><code class="language-bash">$OHOS_ROOT/build-tools/cmake/bin/cmake \ |
109 | -DOHOS_STL=c++_shared \ | 110 | -DOHOS_STL=c++_shared \ |
110 | -DOHOS_ARCH=armv8-a \ | 111 | -DOHOS_ARCH=armv8-a \ |
111 | -DOHOS_PLATFORM=OHOS \ | 112 | -DOHOS_PLATFORM=OHOS \ |
112 | -DCMAKE_TOOLCHAIN_FILE=$(find $OHOS_ROOT -name "ohos.toolchain.cmake")</code></pre> | 113 | -DCMAKE_TOOLCHAIN_FILE=$(find $OHOS_ROOT -name "ohos.toolchain.cmake")</code></pre> |
113 | <p>这次,编译成功了。万岁!</p> | 114 | <p>这次,编译成功了。万岁!</p> |
115 | <p class="time">2024.4</p> | ||
114 | <script src="https://www.qin-juan-ge-zhu.top/common/js/comment.js"></script> | 116 | <script src="https://www.qin-juan-ge-zhu.top/common/js/comment.js"></script> |
115 | </div> | 117 | </div> |
116 | </div> | 118 | </div> |
diff --git a/code/projects/ohos_compile.html b/code/projects/ohos_compile.html index fd52643..c9d240d 100644 --- a/code/projects/ohos_compile.html +++ b/code/projects/ohos_compile.html | |||
@@ -5,16 +5,17 @@ | |||
5 | <meta charset="utf-8" /> | 5 | <meta charset="utf-8" /> |
6 | <meta name="generator" content="pandoc" /> | 6 | <meta name="generator" content="pandoc" /> |
7 | <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> | 7 | <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" /> |
8 | <title>OHOS全量编译记录</title> | 8 | <title>OHOS 全量编译记录</title> |
9 | <link rel="stylesheet" href="https://test.qin-juan-ge-zhu.top/common/CSS/pandoc.css"> | 9 | <link rel="stylesheet" href="https://www.qin-juan-ge-zhu.top/common/CSS/pandoc.css"> |
10 | <script type="text/javascript" src="https://test.qin-juan-ge-zhu.top/common/js/myhighlight.js"></script> | 10 | <script type="text/javascript" src="https://www.qin-juan-ge-zhu.top/common/script4code.js"></script> |
11 | <script type="text/javascript" src="https://test.qin-juan-ge-zhu.top/common/script4code.js"></script> | ||
12 | </head> | 11 | </head> |
13 | 12 | ||
14 | <body> | 13 | <body> |
15 | <div class="pandoc"> | 14 | <div class="pandoc"> |
16 | <div class="main"> | 15 | <div class="main"> |
17 | <p class="title">OHOS 全量编译记录</p> | 16 | <header id="title-block-header"> |
17 | <p class="title">OHOS 全量编译记录</p> | ||
18 | </header> | ||
18 | <!-- 鸿蒙开发环境搭建 --> | 19 | <!-- 鸿蒙开发环境搭建 --> |
19 | <blockquote> | 20 | <blockquote> |
20 | <p>本次编译环境搭建参考了以下博客:</p> | 21 | <p>本次编译环境搭建参考了以下博客:</p> |
@@ -36,8 +37,7 @@ | |||
36 | <h2 id="硬件环境">硬件环境</h2> | 37 | <h2 id="硬件环境">硬件环境</h2> |
37 | <p>编译过程使用的是 | 38 | <p>编译过程使用的是 |
38 | <code>Ubuntu</code>,经测试,<code>Ubuntu 22.04 LTS</code>/<code>Ubuntu 20.04 LTS</code>/<code>Ubuntu 18.04 LTS</code> | 39 | <code>Ubuntu</code>,经测试,<code>Ubuntu 22.04 LTS</code>/<code>Ubuntu 20.04 LTS</code>/<code>Ubuntu 18.04 LTS</code> |
39 | 均可用。 | 40 | 均可用。</p> |
40 | </p> | ||
41 | <p>网上的大多数博客里没有对编译的硬件限制作出说明,现根据我们的情况,给出一个大概的范围:</p> | 41 | <p>网上的大多数博客里没有对编译的硬件限制作出说明,现根据我们的情况,给出一个大概的范围:</p> |
42 | <ul> | 42 | <ul> |
43 | <li><strong>内存必须在 10G 以上</strong>,我使用的是 13G,编译成功(8G 时编译失败了,下文会说明)</li> | 43 | <li><strong>内存必须在 10G 以上</strong>,我使用的是 13G,编译成功(8G 时编译失败了,下文会说明)</li> |
@@ -53,7 +53,7 @@ | |||
53 | <p>这里我用的是 VMWare+Ubuntu22.04 虚拟机。</p> | 53 | <p>这里我用的是 VMWare+Ubuntu22.04 虚拟机。</p> |
54 | <h2 id="软件包依赖">软件包依赖</h2> | 54 | <h2 id="软件包依赖">软件包依赖</h2> |
55 | <p>安装依赖在博客中都有讲,但<strong>少了一部分依赖项</strong>,我因而将所有必要的依赖项整理到一个脚本里了:</p> | 55 | <p>安装依赖在博客中都有讲,但<strong>少了一部分依赖项</strong>,我因而将所有必要的依赖项整理到一个脚本里了:</p> |
56 | <pre><code>#!/bin/bash | 56 | <pre><code class="language-bash">#!/bin/bash |
57 | set -e # 一旦出错立刻停止执行,不会执行后续指令 | 57 | set -e # 一旦出错立刻停止执行,不会执行后续指令 |
58 | 58 | ||
59 | # 更新软件源 | 59 | # 更新软件源 |
@@ -87,7 +87,7 @@ fi</code></pre> | |||
87 | <h1 id="配置-git">配置 git</h1> | 87 | <h1 id="配置-git">配置 git</h1> |
88 | <h2 id="git-基础设置">git 基础设置</h2> | 88 | <h2 id="git-基础设置">git 基础设置</h2> |
89 | <p>在上边我们已经下载了本次所需要的<code>git</code>与<code>git-lfs</code>,接下来我们需要对<code>git</code>进行基础设置。</p> | 89 | <p>在上边我们已经下载了本次所需要的<code>git</code>与<code>git-lfs</code>,接下来我们需要对<code>git</code>进行基础设置。</p> |
90 | <pre><code># 设置用户名与密码,新用户必做 | 90 | <pre><code class="language-bash"># 设置用户名与密码,新用户必做 |
91 | # 这里的用户名与密码只是一个写在git提交记录中的标识,可以与gitee/github账号无关 | 91 | # 这里的用户名与密码只是一个写在git提交记录中的标识,可以与gitee/github账号无关 |
92 | git config --global user.name "yourname" | 92 | git config --global user.name "yourname" |
93 | git config --global user.email "your-email-address" | 93 | git config --global user.email "your-email-address" |
@@ -99,7 +99,7 @@ git config --global core.editor vim</code></pre> | |||
99 | <p>由于 OpenHarmony 的源码托管在 gitee 上,所以我们需要在 gitee 上注册一个帐户。注册的方法在此不复赘述。</p> | 99 | <p>由于 OpenHarmony 的源码托管在 gitee 上,所以我们需要在 gitee 上注册一个帐户。注册的方法在此不复赘述。</p> |
100 | <p>本次编译过程中,我们并不需要提交代码,因而可以仅通过 http 方式从 gitee 下载源码——如果是这样的话,<strong>就不需要进行 git 与 gitee | 100 | <p>本次编译过程中,我们并不需要提交代码,因而可以仅通过 http 方式从 gitee 下载源码——如果是这样的话,<strong>就不需要进行 git 与 gitee |
101 | 关联</strong>;如果想要提交代码,那么需要将本地的 git 与 gitee 账号关联起来,具体操作如下:</p> | 101 | 关联</strong>;如果想要提交代码,那么需要将本地的 git 与 gitee 账号关联起来,具体操作如下:</p> |
102 | <pre><code># 在本地执行 | 102 | <pre><code class="language-bash"># 在本地执行 |
103 | ssh-keygen -t rsa -C "your-email-address"</code></pre> | 103 | ssh-keygen -t rsa -C "your-email-address"</code></pre> |
104 | <p>命令执行后,每次需要输入都直接回车,<strong>连续有三个回车</strong>,执行就会结束,ssh | 104 | <p>命令执行后,每次需要输入都直接回车,<strong>连续有三个回车</strong>,执行就会结束,ssh |
105 | 密钥对的公钥和私钥分别保存在<code>~/.ssh/id_rsa.pub</code>和<code>~/.ssh/id_rsa</code>中。</p> | 105 | 密钥对的公钥和私钥分别保存在<code>~/.ssh/id_rsa.pub</code>和<code>~/.ssh/id_rsa</code>中。</p> |
@@ -107,7 +107,7 @@ ssh-keygen -t rsa -C "your-email-address"</code></pre> | |||
107 | <p>此时,我们就可以通过 ssh 的方式与 gitee 进行交互、也可以免密提交代码了。</p> | 107 | <p>此时,我们就可以通过 ssh 的方式与 gitee 进行交互、也可以免密提交代码了。</p> |
108 | <h1 id="系统源码编译">系统源码编译</h1> | 108 | <h1 id="系统源码编译">系统源码编译</h1> |
109 | <h2 id="配置-repo-工具">配置 repo 工具</h2> | 109 | <h2 id="配置-repo-工具">配置 repo 工具</h2> |
110 | <pre><code>curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > ~/repo | 110 | <pre><code class="language-bash">curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > ~/repo |
111 | chmod a+x ~/repo | 111 | chmod a+x ~/repo |
112 | sudo mv ~/repo /usr/local/bin/repo | 112 | sudo mv ~/repo /usr/local/bin/repo |
113 | sudo chown root:root /usr/local/bin/repo | 113 | sudo chown root:root /usr/local/bin/repo |
@@ -121,7 +121,7 @@ pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests</co | |||
121 | 的区别,如<code>OpenHarmony-v4.0-Release</code>和<code>OpenHarmony-4.0-Release</code>。二者的区别主要在于,不带 v | 121 | 的区别,如<code>OpenHarmony-v4.0-Release</code>和<code>OpenHarmony-4.0-Release</code>。二者的区别主要在于,不带 v |
122 | 的是官方维护的稳定版,也会更新代码,厂商的补丁一般只针对带 v 的使用。</p> | 122 | 的是官方维护的稳定版,也会更新代码,厂商的补丁一般只针对带 v 的使用。</p> |
123 | <p>通过 repo + https/ssh 下载:</p> | 123 | <p>通过 repo + https/ssh 下载:</p> |
124 | <pre><code># 如果需要的是特定分支,-b后边改成对应分支名 | 124 | <pre><code class="language-bash"># 如果需要的是特定分支,-b后边改成对应分支名 |
125 | # repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify | 125 | # repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify |
126 | # 如果是tag,-b后的参数比较复杂,要在网页上提前确定好需要的tag名字, | 126 | # 如果是tag,-b后的参数比较复杂,要在网页上提前确定好需要的tag名字, |
127 | # 如下载的是tag为OpenHarmony-v3.2-Release的版本,命令如下: | 127 | # 如下载的是tag为OpenHarmony-v3.2-Release的版本,命令如下: |
@@ -133,11 +133,11 @@ repo sync -c | |||
133 | repo forall -c 'git lfs pull'</code></pre> | 133 | repo forall -c 'git lfs pull'</code></pre> |
134 | <h2 id="补丁与编译">补丁与编译</h2> | 134 | <h2 id="补丁与编译">补丁与编译</h2> |
135 | <p>首先,打上厂商的补丁。下载对应版本补丁后,将补丁文件放到源码根目录下,执行:</p> | 135 | <p>首先,打上厂商的补丁。下载对应版本补丁后,将补丁文件放到源码根目录下,执行:</p> |
136 | <pre><code>unzip purple_pi_oh_patch.zip | 136 | <pre><code class="language-bash">unzip purple_pi_oh_patch.zip |
137 | cd purple_pi_oh_patch | 137 | cd purple_pi_oh_patch |
138 | ./ido_patch.sh</code></pre> | 138 | ./ido_patch.sh</code></pre> |
139 | <p>看到<code>patch complete</code>字样,说明补丁成功。接下来进行 prebuilts 和编译:</p> | 139 | <p>看到<code>patch complete</code>字样,说明补丁成功。接下来进行 prebuilts 和编译:</p> |
140 | <pre><code># 先在源码根目录下执行脚本,安装编译器及二进制工具 | 140 | <pre><code class="language-bash"># 先在源码根目录下执行脚本,安装编译器及二进制工具 |
141 | bash build/prebuilts_download.sh | 141 | bash build/prebuilts_download.sh |
142 | 142 | ||
143 | # 编译 | 143 | # 编译 |
@@ -181,22 +181,22 @@ sudo ./build.sh --product-name purple_pi_oh --ccache --no-prebuilt-sdk --target- | |||
181 | <li>右键该分区,查看挂载到什么位置了。一般是挂载到<code>/</code>与<code>/var/snap/firefox/common/host-hunspell</code></li> | 181 | <li>右键该分区,查看挂载到什么位置了。一般是挂载到<code>/</code>与<code>/var/snap/firefox/common/host-hunspell</code></li> |
182 | <li>执行以下命令:</li> | 182 | <li>执行以下命令:</li> |
183 | </ul> | 183 | </ul> |
184 | <pre><code># 对于这个设备挂载到的每一个分区,都执行以下命令,以此类推 | 184 | <pre><code class="language-bash"># 对于这个设备挂载到的每一个分区,都执行以下命令,以此类推 |
185 | sudo mount -o remount -rw / | 185 | sudo mount -o remount -rw / |
186 | sudo mount -o remount -rw /var/snap/firefox/common/host-hunspell</code></pre> | 186 | sudo mount -o remount -rw /var/snap/firefox/common/host-hunspell</code></pre> |
187 | <p>而后在 gparted 中点击<code>gparted->刷新设备</code>,即可进行分区扩展。</p> | 187 | <p>而后在 gparted 中点击<code>gparted->刷新设备</code>,即可进行分区扩展。</p> |
188 | <h2 id="ninja-编译报错-code-4000">Ninja 编译报错 <code>Code 4000</code></h2> | 188 | <h2 id="ninja-编译报错-code-4000">Ninja 编译报错 <code>Code 4000</code></h2> |
189 | <p>编译 rk3568 过程中可能会出现以下报错:</p> | 189 | <p>编译 rk3568 过程中可能会出现以下报错:</p> |
190 | <pre><code>[OHOS ERROR] Code: 4000 | 190 | <pre><code class="language-plaintext">[OHOS ERROR] Code: 4000 |
191 | [OHOS ERROR] Reason: ninja phase failed</code></pre> | 191 | [OHOS ERROR] Reason: ninja phase failed</code></pre> |
192 | <p>详细的报错信息已经丢失,将就着看吧。反正别的办法都不好使的时候试试这个。</p> | 192 | <p>详细的报错信息已经丢失,将就着看吧。反正别的办法都不好使的时候试试这个。</p> |
193 | <p>此时执行以下内容即可:</p> | 193 | <p>此时执行以下内容即可:</p> |
194 | <pre><code>rm -rf out | 194 | <pre><code class="language-bash">rm -rf out |
195 | sed -i 's/CONFIG_DEBUG_INFO_BTF=y/# CONFIG_DEBUG_INFO_BTF=y/g' kernel/linux/config/linux-5.10/rk3568/arch/arm64_defconfig</code></pre> | 195 | sed -i 's/CONFIG_DEBUG_INFO_BTF=y/# CONFIG_DEBUG_INFO_BTF=y/g' kernel/linux/config/linux-5.10/rk3568/arch/arm64_defconfig</code></pre> |
196 | <p>而后重新编译。</p> | 196 | <p>而后重新编译。</p> |
197 | <h2 id="另一个code-4000">另一个<code>Code 4000</code></h2> | 197 | <h2 id="另一个code-4000">另一个<code>Code 4000</code></h2> |
198 | <p>编译时报错如下:</p> | 198 | <p>编译时报错如下:</p> |
199 | <pre><code>ninja: build stopped: subcommand failed. | 199 | <pre><code class="language-plaintext">ninja: build stopped: subcommand failed. |
200 | [91m[OHOS ERROR][0m Traceback (most recent call last): | 200 | [91m[OHOS ERROR][0m Traceback (most recent call last): |
201 | [91m[OHOS ERROR][0m File "/home/player/Desktop/ohos/src/build/hb/services/ninja.py", line 49, in _execute_ninja_cmd | 201 | [91m[OHOS ERROR][0m File "/home/player/Desktop/ohos/src/build/hb/services/ninja.py", line 49, in _execute_ninja_cmd |
202 | [91m[OHOS ERROR][0m SystemUtil.exec_command( | 202 | [91m[OHOS ERROR][0m SystemUtil.exec_command( |
@@ -250,13 +250,13 @@ sed -i 's/CONFIG_DEBUG_INFO_BTF=y/# CONFIG_DEBUG_INFO_BTF=y/g' kernel/li | |||
250 | <p>这是一个很奇怪的报错,我们尚未找到真正的原因所在,只知道如何暂时地绕过去。</p> | 250 | <p>这是一个很奇怪的报错,我们尚未找到真正的原因所在,只知道如何暂时地绕过去。</p> |
251 | <h3 id="问题描述与复现">问题描述与复现</h3> | 251 | <h3 id="问题描述与复现">问题描述与复现</h3> |
252 | <p>问题复现方法为在编译过程中,执行以下命令:</p> | 252 | <p>问题复现方法为在编译过程中,执行以下命令:</p> |
253 | <pre><code>./build.sh --product-name rk3568 --ccache</code></pre> | 253 | <pre><code class="language-bash">./build.sh --product-name rk3568 --ccache</code></pre> |
254 | <p>该命令是指导书中写的编译命令,但执行时候会出错;<strong>与上文所述的经确认无误的编译命令不同在于没加<code>sudo</code></strong>。</p> | 254 | <p>该命令是指导书中写的编译命令,但执行时候会出错;<strong>与上文所述的经确认无误的编译命令不同在于没加<code>sudo</code></strong>。</p> |
255 | <p>如果按照指导书的命令来,不出意外编译将会报错: <img src="https://www.qin-juan-ge-zhu.top/images/code/ohos_gn_fail_1.png" /> <img | 255 | <p>如果按照指导书的命令来,不出意外编译将会报错: <img src="https://www.qin-juan-ge-zhu.top/images/code/ohos_compile_gn_fail_1.png" /> <img |
256 | src="https://www.qin-juan-ge-zhu.top/images/code/ohos_gn_fail_2.png" /></p> | 256 | src="https://www.qin-juan-ge-zhu.top/images/code/ohos_compile_gn_fail_2.png" /></p> |
257 | <p><strong>以下是该问题的具体描述:</strong></p> | 257 | <p><strong>以下是该问题的具体描述:</strong></p> |
258 | <p><code>build.log</code>如下:</p> | 258 | <p><code>build.log</code>如下:</p> |
259 | <pre><code>Set cache size limit to 100.0 GB | 259 | <pre><code class="language-plaintext">Set cache size limit to 100.0 GB |
260 | [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'] | 260 | [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'] |
261 | [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 | 261 | [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 |
262 | ERROR at //build/config/BUILDCONFIG.gn:92:15: Could not read file. | 262 | ERROR at //build/config/BUILDCONFIG.gn:92:15: Could not read file. |
@@ -296,7 +296,7 @@ current_toolchain= | |||
296 | <p>在此,我进行了许多尝试,但都无一例外失败了;以下是我的尝试点,或许会有帮助:</p> | 296 | <p>在此,我进行了许多尝试,但都无一例外失败了;以下是我的尝试点,或许会有帮助:</p> |
297 | <ul> | 297 | <ul> |
298 | <li>根据<a href="">一个相似提问</a>,对相关依赖进行安装,失败了: <img | 298 | <li>根据<a href="">一个相似提问</a>,对相关依赖进行安装,失败了: <img |
299 | src="https://www.qin-juan-ge-zhu.top/images/code/ohos_gn_fail_dependencies.png" /></li> | 299 | src="https://www.qin-juan-ge-zhu.top/images/code/ohos_compile_gn_fail_dependencies.png" /></li> |
300 | <li>根据报错信息,在编译命令中添加<code>--no-prebuilt-sdk</code>选项对 ohos-sdk 的构建进行跳过,依然失败</li> | 300 | <li>根据报错信息,在编译命令中添加<code>--no-prebuilt-sdk</code>选项对 ohos-sdk 的构建进行跳过,依然失败</li> |
301 | </ul> | 301 | </ul> |
302 | <p>尝试未果 T^T</p> | 302 | <p>尝试未果 T^T</p> |
@@ -304,7 +304,7 @@ current_toolchain= | |||
304 | <p>报错信息如下所示:</p> | 304 | <p>报错信息如下所示:</p> |
305 | <p>在上述报错信息中提到<code>Permission denied</code>,即权限不够;于是尝试添加<code>sudo</code>,居然跑通了!!!!</p> | 305 | <p>在上述报错信息中提到<code>Permission denied</code>,即权限不够;于是尝试添加<code>sudo</code>,居然跑通了!!!!</p> |
306 | <p>在指导书的编译指令<code>./build.sh --product-name rk3568 --ccache</code>前添加权限设置<code>sudo</code>,即指令更改为:</p> | 306 | <p>在指导书的编译指令<code>./build.sh --product-name rk3568 --ccache</code>前添加权限设置<code>sudo</code>,即指令更改为:</p> |
307 | <pre><code>sudo ./build.sh --product-name rk3568 --ccache</code></pre> | 307 | <pre><code class="language-bash">sudo ./build.sh --product-name rk3568 --ccache</code></pre> |
308 | <p>不知道为什么,编译过程中始终没有向我提出权限要求,但是不加<code>sudo</code>开权限就是跑不通,很奇怪 @ _ <span class="citation" | 308 | <p>不知道为什么,编译过程中始终没有向我提出权限要求,但是不加<code>sudo</code>开权限就是跑不通,很奇怪 @ _ <span class="citation" |
309 | data-cites="也许是">@也许是</span> OHOS 内敛不好意思申请权限呢……</p> | 309 | data-cites="也许是">@也许是</span> OHOS 内敛不好意思申请权限呢……</p> |
310 | <h2 id="另一个奇怪的报错failed-load-btf-from-vmlinux-unknown-error--22"> | 310 | <h2 id="另一个奇怪的报错failed-load-btf-from-vmlinux-unknown-error--22"> |
@@ -312,7 +312,7 @@ current_toolchain= | |||
312 | <p>关于这个报错,当时的错误日志、运行日志、聊天截图均已丢失,但时日不久,记忆还算清楚,加上这个报错困扰了我好些天,因而必须记录。</p> | 312 | <p>关于这个报错,当时的错误日志、运行日志、聊天截图均已丢失,但时日不久,记忆还算清楚,加上这个报错困扰了我好些天,因而必须记录。</p> |
313 | <h3 id="问题简要描述">问题简要描述</h3> | 313 | <h3 id="问题简要描述">问题简要描述</h3> |
314 | <p>正常按照<code>sudo ./build.sh --product-name rk3568 --ccache</code>编译时,报错,主要报错信息如下:</p> | 314 | <p>正常按照<code>sudo ./build.sh --product-name rk3568 --ccache</code>编译时,报错,主要报错信息如下:</p> |
315 | <pre><code>die__process_unit: DW_TAG_label (0xa) @ <0x3adc> not handled! | 315 | <pre><code class="language-plaintext">die__process_unit: DW_TAG_label (0xa) @ <0x3adc> not handled! |
316 | die__process_unit: DW_TAG_label (0xa) @ <0x3bdc> not handled! | 316 | die__process_unit: DW_TAG_label (0xa) @ <0x3bdc> not handled! |
317 | die__process_unit: DW_TAG_label (0xa) @ <0x3bef> not handled! | 317 | die__process_unit: DW_TAG_label (0xa) @ <0x3bef> not handled! |
318 | die__process_unit: DW_TAG_label (0xa) @ <0x3ce5> not handled! | 318 | die__process_unit: DW_TAG_label (0xa) @ <0x3ce5> not handled! |
@@ -333,7 +333,7 @@ make[1]: *** [arch/arm64/Makefile:208: rk3568-toybrick-x0-linux.img]错误2 | |||
333 | make[1]: 离开目录"/home/player/harmony/out/kernel/OBJ/linux-5.10" | 333 | make[1]: 离开目录"/home/player/harmony/out/kernel/OBJ/linux-5.10" |
334 | make: *** [Makefile:192:__sub-make]错误 2</code></pre> | 334 | make: *** [Makefile:192:__sub-make]错误 2</code></pre> |
335 | <p>可以看到,报错的关键点在于<code>FAILED: load BTF from vmlinux: Unknown error -22</code>这里。查看 Makefile 对应报错位置:</p> | 335 | <p>可以看到,报错的关键点在于<code>FAILED: load BTF from vmlinux: Unknown error -22</code>这里。查看 Makefile 对应报错位置:</p> |
336 | <pre><code>vmlinux: scripts/link-vmlinux.sh autoksyms_recursive $(vmlinux-deps) FORCE | 336 | <pre><code class="language-makefile">vmlinux: scripts/link-vmlinux.sh autoksyms_recursive $(vmlinux-deps) FORCE |
337 | +$(call if_changed,link-vmlinux) | 337 | +$(call if_changed,link-vmlinux) |
338 | 338 | ||
339 | targets := vmlinux</code></pre> | 339 | targets := vmlinux</code></pre> |
@@ -362,7 +362,7 @@ targets := vmlinux</code></pre> | |||
362 | 时候推荐的最大虚拟机内存)是能编译完成的,编译时长 6h。最终解决。</p> | 362 | 时候推荐的最大虚拟机内存)是能编译完成的,编译时长 6h。最终解决。</p> |
363 | <h1 id="ohos-的-ndk">ohos 的 NDK</h1> | 363 | <h1 id="ohos-的-ndk">ohos 的 NDK</h1> |
364 | <p>NDK 编译方式比较简单,在源码根目录下执行如下命令:</p> | 364 | <p>NDK 编译方式比较简单,在源码根目录下执行如下命令:</p> |
365 | <pre><code># 安装依赖 | 365 | <pre><code class="language-bash"># 安装依赖 |
366 | ./build/build_scripts/env_setup.sh | 366 | ./build/build_scripts/env_setup.sh |
367 | 367 | ||
368 | # 执行完上述命令后记得执行source ~/.bashrc或者重启终端 | 368 | # 执行完上述命令后记得执行source ~/.bashrc或者重启终端 |
@@ -377,7 +377,7 @@ sudo apt-get install libxcursor-dev libxrandr-dev libxinerama-dev | |||
377 | <p>注意,NDK 包提供的交叉编译工具是 cmake 和 ninja,编译器是 clang 和 clang++,并没有我们熟悉的 gcc/g++和 make。除此之外,NDK | 377 | <p>注意,NDK 包提供的交叉编译工具是 cmake 和 ninja,编译器是 clang 和 clang++,并没有我们熟悉的 gcc/g++和 make。除此之外,NDK |
378 | 还未我们提供编译所需的全套服务,如编译工具链配置文件<code>ohos.toolchain.cmake</code>、头文件、库文件等。快说,谢谢 ohos~</p> | 378 | 还未我们提供编译所需的全套服务,如编译工具链配置文件<code>ohos.toolchain.cmake</code>、头文件、库文件等。快说,谢谢 ohos~</p> |
379 | <p>为了更方便地使用 NDK,鄙人不才,写了两个脚本,分别用于 cmake 编译和单文件编译:</p> | 379 | <p>为了更方便地使用 NDK,鄙人不才,写了两个脚本,分别用于 cmake 编译和单文件编译:</p> |
380 | <pre><code>#!/bin/bash | 380 | <pre><code class="language-bash">#!/bin/bash |
381 | 381 | ||
382 | ####################################################################### | 382 | ####################################################################### |
383 | # File Name : compile.sh | 383 | # File Name : compile.sh |
@@ -418,7 +418,7 @@ cmake -B build -D OHOS_STL=c++_$link -D OHOS_ARCH=$arch \ | |||
418 | -D OHOS_PLATFORM=OHOS \ | 418 | -D OHOS_PLATFORM=OHOS \ |
419 | -D CMAKE_TOOLCHAIN_FILE=$(find $native_path -name ohos.toolchain.cmake) | 419 | -D CMAKE_TOOLCHAIN_FILE=$(find $native_path -name ohos.toolchain.cmake) |
420 | cmake --build build</code></pre> | 420 | cmake --build build</code></pre> |
421 | <pre><code>#!/bin/bash | 421 | <pre><code class="language-bash">#!/bin/bash |
422 | 422 | ||
423 | ####################################################################### | 423 | ####################################################################### |
424 | # File Name : compile-tiny.sh | 424 | # File Name : compile-tiny.sh |
@@ -492,7 +492,7 @@ $compiler -o $targetFile $file -Wall \ | |||
492 | </ul> | 492 | </ul> |
493 | <p>不说了,抓紧攒点钱开学升级电脑配置要紧……磁盘快炸了……</p> | 493 | <p>不说了,抓紧攒点钱开学升级电脑配置要紧……磁盘快炸了……</p> |
494 | <p class="time">2024.2.12,甲辰年正月初三<br>2024.4.24改<br>2024.11.19改</p> | 494 | <p class="time">2024.2.12,甲辰年正月初三<br>2024.4.24改<br>2024.11.19改</p> |
495 | <script src="https://test.qin-juan-ge-zhu.top/common/js/comment.js"></script> | 495 | <script src="https://www.qin-juan-ge-zhu.top/common/js/comment.js"></script> |
496 | </div> | 496 | </div> |
497 | </div> | 497 | </div> |
498 | </body> | 498 | </body> |