summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWe-unite <3205135446@qq.com>2024-05-25 10:52:52 +0800
committerWe-unite <3205135446@qq.com>2024-05-25 10:52:52 +0800
commit911305a600e37a42acf69037b313912178c7010d (patch)
treebdcc1be89adff13fcd12ee33469281a2158c0b35
parentb128469110903d943de3ab8f55c0651c55cd88a0 (diff)
downloadmyweb-911305a600e37a42acf69037b313912178c7010d.tar.gz
myweb-911305a600e37a42acf69037b313912178c7010d.zip
Add LCM cross-compile.
lcm cross-compile method is now right, but missing glib2 while compiling it. It should be solved next time.
-rw-r--r--code/ohos/lcm_compile.html119
-rw-r--r--code/ohos/lcm_compile.md141
-rw-r--r--code/ohos/ohos_compile.html63
-rw-r--r--code/ohos/ohos_compile.md106
-rw-r--r--common/html2js.c25
-rw-r--r--common/script4works.html20
-rw-r--r--common/script4works.js20
7 files changed, 424 insertions, 70 deletions
diff --git a/code/ohos/lcm_compile.html b/code/ohos/lcm_compile.html
new file mode 100644
index 0000000..dbc8109
--- /dev/null
+++ b/code/ohos/lcm_compile.html
@@ -0,0 +1,119 @@
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>LCM 交叉编译</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 <p class="title">LCM 交叉编译</p>
18 <!-- 编译集成lcm模块 -->
19 <h1 id="lcm-简介">LCM 简介</h1>
20 <p>LCM(Lightweight Communications and
21 Marshalling)是一种轻量级的通信和编组库,是一种针对高带宽、低延迟、实时性要求高的场景下的通讯工具,用于在多个进程之间传递消息。LCM 的设计目标是提供一种简单的方法来传递结构化数据,而不需要复杂的
22 API 或协议定义。LCM 的消息传递是基于发布/订阅模型的,发布者和订阅者之间通过一个中心化的消息传递系统进行通信。</p>
23 <p>在机器人和自动驾驶系统中,LCM 可作为 ROS 的替代品,借以完成进程间、设备间的通讯。</p>
24 <p>为了方便地在不同进程、不同设备间传递数据,我们在 OHOS 系统中集成了 LCM 模块。</p>
25 <p>参考文档:</p>
26 <ul>
27 <li><a href="https://lcm-proj.github.io/">LCM 官方文档</a></li>
28 <li><a href="https://zhuanlan.zhihu.com/p/621943685">一篇博客</a></li>
29 </ul>
30 <h1 id="依赖项安装">依赖项安装</h1>
31 <pre><code>sudo apt update
32sudo apt upgrade
33sudo apt install build-essential cmake libglib2.0-dev
34sudo apt install openjdk-8-jdk # lcm仅支持jdk8</code></pre>
35 <h1 id="x86-的-lcm">x86 的 lcm</h1>
36 <p>如果我们仅仅需要 x86 架构的 lcm,执行下列命令即可:</p>
37 <pre><code>git clone https://github.com/lcm-proj/lcm
38cd lcm
39mkdir build &amp;&amp; cd build
40cmake ..
41make
42sudo make install</code></pre>
43 <p>编译完成后,注意观察<kbd>build</kbd>目录下是否有<kbd>lcm-java</kbd>文件夹,如果没有,证明没有安装 java 或者 java 版本不对。</p>
44 <h2 id="lcm-python">lcm-python</h2>
45 <p>若想使用<kbd>lcm-python</kbd>,在<kbd>lcm/lcm-python</kbd>下执行<code>sudo python3 setup.py install</code>即可,使用时<code>import python</code>。
46 </p>
47 <h2 id="lcm-spy-的使用">lcm-spy 的使用</h2>
48 <p>lcm-spy 是 LCM 配套的数据可视化工具。 可以通过 lcm-spy 监视 lcm 数据发送频率、数据量、数据结构,甚至实时画图。 如果安装了 JAVA,则 lcm-spy 会连同 LCM 一同被安装。
49 </p>
50 <p>启动 lcm-spy:</p>
51 <pre><code>export CLASSPATH=${your lcm-type class path}
52lcm-spy</code></pre>
53 <h1 id="交叉编译">交叉编译</h1>
54 <p>既然 lcm 用的是 cmake,何不交叉编译到 OHOS 里用呢?</p>
55 <p>首先,我们可以设置一下 Native Development Kit(NDK)的路径:</p>
56 <pre><code># 设置成自己的NDK工具目录
57export OHOS_ROOT=~/app/native</code></pre>
58 <pre><code>$OHOS_ROOT/build-tools/cmake/bin/cmake \
59 -DOHOS_STL=c++_shared \
60 -DOHOS_ARCH=armv8-a \
61 -DOHOS_PLATFORM=OHOS \
62 -DCMAKE_TOOLCHAIN_FILE=$(find $OHOS_ROOT -name &quot;ohos.toolchain.cmake&quot;)</code></pre>
63 <p>不出意外的话,就要出意外了。果不其然,报错<kbd>Could NOT fid Glib2</kbd>。思考之后,我们认为,问题出现在 lcm 所依赖的 glib 库上:在 x86
64 架构上,我们直接向系统安装了<code>libglib2.0-dev</code>,而 lcm 编译时直接从系统里找到了这个库;但当交叉编译时,由于 OHOS 交叉编译工具未提供
65 libglib2.0-dev,lcm 找遍了系统也没找到 arm 架构下的这个库,因而直接报错。</p>
66 <p>解决方案自然是自己手动交叉编译<code>libglib2.0-dev</code>。</p>
67 <h2 id="glib2.0-交叉编译">Glib2.0 交叉编译</h2>
68 <p>从<a href="https://download.gnome.org/sources/glib/">官网</a>下载 glib-2.79.2 源码,解压后进入源码目录。</p>
69 <pre><code>mkdir glib &amp;&amp; cd glib
70wget https://download.gnome.org/sources/glib/2.79/glib-2.79.2.tar.xz
71tar -xvf glib-2.79.2.tar.xz
72mkdir build</code></pre>
73 <p>这里需要注意的是:</p>
74 <ul>
75 <li>虽然 glib 编译需要<code>meson</code>,但它并不能直接交叉编译,OHOS 也并未提供用于交叉编译的<code>meson</code>。</li>
76 <li><code>meson</code>要求保证源码目录与构建目录不能相同,以保证构建过程的干净,因此我们在源码目录外新建了一个<code>build</code>目录。</li>
77 </ul>
78 <p>接着,参考博客<a
79 href="https://t.csdnimg.cn/YfSJC">这篇博客</a>,撰写如下<kbd>meson_ohos.txt</kbd>(友情提醒,使用该文件时把<kbd>native</kbd>也就是
80 NDK 的路径修改为自己的路径、源平台与目标平台按需修改):</p>
81 <pre><code>[binaries]
82c = &#39;$OHOS_ROOT/llvm/bin/aarch64-unknown-linux-ohos-clang&#39;
83cpp = &#39;$OHOS_ROOT/llvm/bin/aarch64-unknown-linux-ohos-clang++&#39;
84ar = &#39;$OHOS_ROOT/llvm/bin/llvm-ar&#39;
85strip = &#39;$OHOS_ROOT/llvm/bin/llvm-strip&#39;
86ld = &#39;$OHOS_ROOT/llvm/bin/llvm-link&#39;
87
88[properties]
89skip_sanity_check = true
90sys_root = &#39;$OHOS_ROOT/sysroot&#39;
91c_args = [&#39;-L$OHOS_ROOT/sysroot/usr/lib/aarch64-linux-ohos&#39;]
92
93[host_machine]
94system = &#39;linux&#39;
95cpu_family = &#39;aarch64&#39;
96cpu = &#39;aarch64&#39;
97endian = &#39;little&#39;
98
99[target_machine]
100system = &#39;ohos&#39;
101cpu_family = &#39;aarch64&#39;
102cpu = &#39;armv8a&#39;
103endian = &#39;little&#39;</code></pre>
104 <p>将该文件放置在<kbd>glib-2.79.2</kbd>源码目录下,而后在<kbd>build</kbd>目录下执行以下命令:</p>
105 <pre><code>meson --cross-file=../glib-2.79.2/meson_ohos.txt ..
106ninja</code></pre>
107 <p>编译完成,正确地安装 glib2 到交叉编译工具链中(???),之后我们回到 lcm 的源码目录,重新执行 cmake 命令:</p>
108 <pre><code>$OHOS_ROOT/build-tools/cmake/bin/cmake \
109 -DOHOS_STL=c++_shared \
110 -DOHOS_ARCH=armv8-a \
111 -DOHOS_PLATFORM=OHOS \
112 -DCMAKE_TOOLCHAIN_FILE=$(find $OHOS_ROOT -name &quot;ohos.toolchain.cmake&quot;)</code></pre>
113 <p>这次,编译成功了。万岁!</p>
114 <script src="https://www.qin-juan-ge-zhu.top/common/js/comment.js"></script>
115 </div>
116 </div>
117</body>
118
119</html> \ No newline at end of file
diff --git a/code/ohos/lcm_compile.md b/code/ohos/lcm_compile.md
new file mode 100644
index 0000000..8f34297
--- /dev/null
+++ b/code/ohos/lcm_compile.md
@@ -0,0 +1,141 @@
1<!-- 编译集成lcm模块 -->
2
3# LCM 简介
4
5LCM(Lightweight Communications and Marshalling)是一种轻量级的通信和编组库,是一种针对高带宽、低延迟、实时性要求高的场景下的通讯工具,用于在多个进程之间传递消息。LCM 的设计目标是提供一种简单的方法来传递结构化数据,而不需要复杂的 API 或协议定义。LCM 的消息传递是基于发布/订阅模型的,发布者和订阅者之间通过一个中心化的消息传递系统进行通信。
6
7在机器人和自动驾驶系统中,LCM 可作为 ROS 的替代品,借以完成进程间、设备间的通讯。
8
9为了方便地在不同进程、不同设备间传递数据,我们在 OHOS 系统中集成了 LCM 模块。
10
11参考文档:
12
13- [LCM 官方文档](https://lcm-proj.github.io/)
14- [一篇博客](https://zhuanlan.zhihu.com/p/621943685)
15
16# 依赖项安装
17
18```bash
19sudo apt update
20sudo apt upgrade
21sudo apt install build-essential cmake libglib2.0-dev
22sudo apt install openjdk-8-jdk # lcm仅支持jdk8
23```
24
25# x86 的 lcm
26
27如果我们仅仅需要 x86 架构的 lcm,执行下列命令即可:
28
29```bash
30git clone https://github.com/lcm-proj/lcm
31cd lcm
32mkdir build && cd build
33cmake ..
34make
35sudo make install
36```
37
38编译完成后,注意观察<kbd>build</kbd>目录下是否有<kbd>lcm-java</kbd>文件夹,如果没有,证明没有安装 java 或者 java 版本不对。
39
40## lcm-python
41
42若想使用<kbd>lcm-python</kbd>,在<kbd>lcm/lcm-python</kbd>下执行`sudo python3 setup.py install`即可,使用时`import python`。
43
44## lcm-spy 的使用
45
46lcm-spy 是 LCM 配套的数据可视化工具。
47可以通过 lcm-spy 监视 lcm 数据发送频率、数据量、数据结构,甚至实时画图。
48如果安装了 JAVA,则 lcm-spy 会连同 LCM 一同被安装。
49
50启动 lcm-spy:
51
52```bash
53export CLASSPATH=${your lcm-type class path}
54lcm-spy
55```
56
57# 交叉编译
58
59既然 lcm 用的是 cmake,何不交叉编译到 OHOS 里用呢?
60
61首先,我们可以设置一下 Native Development Kit(NDK)的路径:
62
63```bash
64# 设置成自己的NDK工具目录
65export OHOS_ROOT=~/app/native
66```
67
68```bash
69$OHOS_ROOT/build-tools/cmake/bin/cmake \
70 -DOHOS_STL=c++_shared \
71 -DOHOS_ARCH=armv8-a \
72 -DOHOS_PLATFORM=OHOS \
73 -DCMAKE_TOOLCHAIN_FILE=$(find $OHOS_ROOT -name "ohos.toolchain.cmake")
74```
75
76不出意外的话,就要出意外了。果不其然,报错<kbd>Could NOT fid Glib2</kbd>。思考之后,我们认为,问题出现在 lcm 所依赖的 glib 库上:在 x86 架构上,我们直接向系统安装了`libglib2.0-dev`,而 lcm 编译时直接从系统里找到了这个库;但当交叉编译时,由于 OHOS 交叉编译工具未提供 libglib2.0-dev,lcm 找遍了系统也没找到 arm 架构下的这个库,因而直接报错。
77
78解决方案自然是自己手动交叉编译`libglib2.0-dev`。
79
80## Glib2.0 交叉编译
81
82从[官网](https://download.gnome.org/sources/glib/)下载 glib-2.79.2 源码,解压后进入源码目录。
83
84```bash
85mkdir glib && cd glib
86wget https://download.gnome.org/sources/glib/2.79/glib-2.79.2.tar.xz
87tar -xvf glib-2.79.2.tar.xz
88mkdir build
89```
90
91这里需要注意的是:
92
93- 虽然 glib 编译需要`meson`,但它并不能直接交叉编译,OHOS 也并未提供用于交叉编译的`meson`。
94- `meson`要求保证源码目录与构建目录不能相同,以保证构建过程的干净,因此我们在源码目录外新建了一个`build`目录。
95
96接着,参考博客[这篇博客](https://t.csdnimg.cn/YfSJC),撰写如下<kbd>meson_ohos.txt</kbd>(友情提醒,使用该文件时把<kbd>native</kbd>也就是 NDK 的路径修改为自己的路径、源平台与目标平台按需修改):
97
98```meson
99[binaries]
100c = '$OHOS_ROOT/llvm/bin/aarch64-unknown-linux-ohos-clang'
101cpp = '$OHOS_ROOT/llvm/bin/aarch64-unknown-linux-ohos-clang++'
102ar = '$OHOS_ROOT/llvm/bin/llvm-ar'
103strip = '$OHOS_ROOT/llvm/bin/llvm-strip'
104ld = '$OHOS_ROOT/llvm/bin/llvm-link'
105
106[properties]
107skip_sanity_check = true
108sys_root = '$OHOS_ROOT/sysroot'
109c_args = ['-L$OHOS_ROOT/sysroot/usr/lib/aarch64-linux-ohos']
110
111[host_machine]
112system = 'linux'
113cpu_family = 'aarch64'
114cpu = 'aarch64'
115endian = 'little'
116
117[target_machine]
118system = 'ohos'
119cpu_family = 'aarch64'
120cpu = 'armv8a'
121endian = 'little'
122```
123
124将该文件放置在<kbd>glib-2.79.2</kbd>源码目录下,而后在<kbd>build</kbd>目录下执行以下命令:
125
126```bash
127meson --cross-file=../glib-2.79.2/meson_ohos.txt ..
128ninja
129```
130
131编译完成,正确地安装 glib2 到交叉编译工具链中(???),之后我们回到 lcm 的源码目录,重新执行 cmake 命令:
132
133```bash
134$OHOS_ROOT/build-tools/cmake/bin/cmake \
135 -DOHOS_STL=c++_shared \
136 -DOHOS_ARCH=armv8-a \
137 -DOHOS_PLATFORM=OHOS \
138 -DCMAKE_TOOLCHAIN_FILE=$(find $OHOS_ROOT -name "ohos.toolchain.cmake")
139```
140
141这次,编译成功了。万岁!
diff --git a/code/ohos/ohos_compile.html b/code/ohos/ohos_compile.html
index 6d6b3ce..bf72035 100644
--- a/code/ohos/ohos_compile.html
+++ b/code/ohos/ohos_compile.html
@@ -5,7 +5,7 @@
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>Open Harmony 编译</title> 8 <title>OpenHarmony 3.2 编译</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://www.qin-juan-ge-zhu.top/common/js/myhighlight.js"></script> 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> 11 <script type="text/javascript" src="https://www.qin-juan-ge-zhu.top/common/script4code.js"></script>
@@ -15,9 +15,10 @@
15 <div class="pandoc"> 15 <div class="pandoc">
16 <div class="main"> 16 <div class="main">
17 <header id="title-block-header"> 17 <header id="title-block-header">
18 <p class="title">Open Harmony 编译</p> 18 <p class="title">OpenHarmony 3.2 编译</p>
19 </header> 19 </header>
20 <!-- 鸿蒙开发环境搭建 --> 20 <!-- 鸿蒙开发环境搭建 -->
21 <p>[toc]</p>
21 <blockquote> 22 <blockquote>
22 <p>本次编译环境搭建参考了以下博客:</p> 23 <p>本次编译环境搭建参考了以下博客:</p>
23 <ul> 24 <ul>
@@ -38,8 +39,7 @@
38 <h2 id="硬件环境">硬件环境</h2> 39 <h2 id="硬件环境">硬件环境</h2>
39 <p>编译过程使用的是 40 <p>编译过程使用的是
40 <code>Ubuntu</code>,经测试,<code>Ubuntu 22.04 LTS</code>/<code>Ubuntu 20.04 LTS</code>/<code>Ubuntu 18.04 LTS</code> 41 <code>Ubuntu</code>,经测试,<code>Ubuntu 22.04 LTS</code>/<code>Ubuntu 20.04 LTS</code>/<code>Ubuntu 18.04 LTS</code>
41 均可用。 42 均可用。</p>
42 </p>
43 <p>网上的大多数博客里没有对编译的硬件限制作出说明,现根据我们的情况,给出一个大概的范围:</p> 43 <p>网上的大多数博客里没有对编译的硬件限制作出说明,现根据我们的情况,给出一个大概的范围:</p>
44 <ul> 44 <ul>
45 <li><strong>内存必须在 10G 以上</strong>,我使用的是 13G,编译成功(8G 时编译失败了,下文会说明)</li> 45 <li><strong>内存必须在 10G 以上</strong>,我使用的是 13G,编译成功(8G 时编译失败了,下文会说明)</li>
@@ -50,20 +50,12 @@
50 <li>我用的是 160G 磁盘,编译成功,但基本不剩什么空间了</li> 50 <li>我用的是 160G 磁盘,编译成功,但基本不剩什么空间了</li>
51 </ul> 51 </ul>
52 </li> 52 </li>
53 <li>注意所需要的<strong>ohos 的版本、cpu 版本、位数等信息</strong></li>
53 </ul> 54 </ul>
54 <p>这里我用的是 VMWare+Ubuntu22.04 虚拟机。</p> 55 <p>这里我用的是 VMWare+Ubuntu22.04 虚拟机。</p>
55 <h2 id="软件包依赖">软件包依赖</h2> 56 <h2 id="软件包依赖">软件包依赖</h2>
56 <p>安装依赖在博客中都有讲,但<strong>少了一部分依赖项</strong>,我因而将所有必要的依赖项整理到一个脚本里了:</p> 57 <p>安装依赖在博客中都有讲,但<strong>少了一部分依赖项</strong>,我因而将所有必要的依赖项整理到一个脚本里了:</p>
57 <pre><code>#!/bin/bash 58 <pre><code>#!/bin/bash
58
59##########################################################################
60# File Name : harmony.sh
61# Encoding : utf-8
62# Author : We-unite
63# Email : weunite1848@gmail.com
64# Created Time : 2024-02-07 12:32:50
65##########################################################################
66
67set -e # 一旦出错立刻停止执行,不会执行后续指令 59set -e # 一旦出错立刻停止执行,不会执行后续指令
68 60
69# 更新软件源 61# 更新软件源
@@ -115,33 +107,43 @@ ssh-keygen -t rsa -C &quot;your-email-address&quot;</code></pre>
115 密钥对的公钥和私钥分别保存在<code>~/.ssh/id_rsa.pub</code>和<code>~/.ssh/id_rsa</code>中。</p> 107 密钥对的公钥和私钥分别保存在<code>~/.ssh/id_rsa.pub</code>和<code>~/.ssh/id_rsa</code>中。</p>
116 <p>在 gitee 用户的设置界面,将公钥<code>id_rsa.pub</code>的内容复制到 gitee 的 SSH 公钥中,保存即可。</p> 108 <p>在 gitee 用户的设置界面,将公钥<code>id_rsa.pub</code>的内容复制到 gitee 的 SSH 公钥中,保存即可。</p>
117 <p>此时,我们就可以通过 ssh 的方式与 gitee 进行交互、也可以免密提交代码了。</p> 109 <p>此时,我们就可以通过 ssh 的方式与 gitee 进行交互、也可以免密提交代码了。</p>
118 <h1 id="配置-repo-工具">配置 repo 工具</h1> 110 <h1 id="系统源码编译">系统源码编译</h1>
111 <h2 id="配置-repo-工具">配置 repo 工具</h2>
119 <p><strong>注意:前两条命令需要以 root 身份执行!!!</strong></p> 112 <p><strong>注意:前两条命令需要以 root 身份执行!!!</strong></p>
120 <pre><code># 以下两条命令需要以root身份执行 113 <pre><code># 以下两条命令需要以root身份执行
114sudo -s
121curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 &gt; /usr/local/bin/repo 115curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 &gt; /usr/local/bin/repo
122chmod a+x /usr/local/bin/repo 116chmod a+x /usr/local/bin/repo
117exit
123 118
124# 这条普通身份也可以 119# 这条普通身份也可以
125pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests</code></pre> 120pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests</code></pre>
126 <p>之所以前两条命令需要以 root 身份而不能是 sudo,是因为<code>/usr/local/bin</code>是一个只有 root 用户才有写权限的目录,而 sudo 命令虽然是以 root 121 <p>之所以前两条命令需要以 root 身份而不能是 sudo,是因为<code>/usr/local/bin</code>是一个只有 root 用户才有写权限的目录,而 sudo 命令虽然是以 root
127 身份执行,但<strong>重定向时候 sudo 用的也是当前用户身份</strong>,权限不足,自然报错。(<strong>如果是管道,那么 sudo 122 身份执行,但<strong>重定向时候 sudo 用的也是当前用户身份</strong>,权限不足,自然报错。(<strong>如果是管道,那么 sudo
128 也是只对当前命令有效,而不是对后续的整个管道有效。</strong>)</p> 123 也是只对当前命令有效,而不是对后续的整个管道有效。</strong>)</p>
129 <h1 id="系统源码编译">系统源码编译</h1>
130 <h2 id="获取源码">获取源码</h2> 124 <h2 id="获取源码">获取源码</h2>
131 <p>通过 repo + https/ssh 下载:</p> 125 <p>通过 repo + https/ssh 下载:</p>
132 <pre><code># 通过http下载 126 <pre><code># 通过http下载,这里需要注意你需要的ohos的版本
133repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify 127repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify
134# 或者也可以通过ssh下载 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下载
135# repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify 133# repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify
134
136repo sync -c 135repo sync -c
137repo forall -c &#39;git lfs pull&#39;</code></pre> 136repo forall -c &#39;git lfs pull&#39;</code></pre>
138 <h2 id="prebuilts-与编译">prebuilts 与编译</h2> 137 <h2 id="prebuilts-与编译">prebuilts 与编译</h2>
139 <pre><code># 先在源码根目录下执行脚本,安装编译器及二进制工具 138 <pre><code># 先在源码根目录下执行脚本,安装编译器及二进制工具
140bash build/prebuilts_download.sh 139bash build/prebuilts_download.sh
141# 再执行如下命令进行版本编译 140# 再执行如下命令进行版本编译
142sudo ./build.sh --product-name rk3568 --ccache</code></pre> 141# 注意:默认编译的时候,目标cpu是32位,即使为64位cpu也无法使用64位功能
142sudo ./build.sh --product-name rk3568 --ccache
143# 如果是64位cpu,需要加上--target-cpu=arm64
144sudo ./build.sh --product-name rk3568 --ccache --target-cpu=arm64</code></pre>
143 <h2 id="编译完成">编译完成</h2> 145 <h2 id="编译完成">编译完成</h2>
144 <p>编译所生成的文件都归档在 out 目录下,结果镜像输出在源码根目录下的 out/rk3568/packages/phone/images 目录下。</p> 146 <p>编译所生成的文件都归档在 out 目录下,结果镜像输出在源码根目录下的<code>out/rk3568/packages/phone/images</code>目录下。</p>
145 <p>自此源码编译成功,即可进行镜像烧录。</p> 147 <p>自此源码编译成功,即可进行镜像烧录。</p>
146 <h1 id="编译报错解决记录">编译报错解决记录</h1> 148 <h1 id="编译报错解决记录">编译报错解决记录</h1>
147 <p>以下记录编译过程中出现的一些出现过的报错、坑点和注意事项,以为后来者鉴。</p> 149 <p>以下记录编译过程中出现的一些出现过的报错、坑点和注意事项,以为后来者鉴。</p>
@@ -186,8 +188,7 @@ sudo mount -o remount -rw /var/snap/firefox/common/host-hunspell</code></pre>
186 <pre><code>./build.sh --product-name rk3568 --ccache</code></pre> 188 <pre><code>./build.sh --product-name rk3568 --ccache</code></pre>
187 <p>该命令是指导书中写的编译命令,但执行时候会出错;<strong>与上文所述的经确认无误的编译命令不同在于没加<code>sudo</code></strong>。</p> 189 <p>该命令是指导书中写的编译命令,但执行时候会出错;<strong>与上文所述的经确认无误的编译命令不同在于没加<code>sudo</code></strong>。</p>
188 <p>如果按照指导书的命令来,不出意外编译将会报错: <img src="https://www.qin-juan-ge-zhu.top/images/code/ohos_gn_fail_1.png" /> 190 <p>如果按照指导书的命令来,不出意外编译将会报错: <img src="https://www.qin-juan-ge-zhu.top/images/code/ohos_gn_fail_1.png" />
189 <img src="https://www.qin-juan-ge-zhu.top/images/code/ohos_gn_fail_2.png" /> 191 <img src="https://www.qin-juan-ge-zhu.top/images/code/ohos_gn_fail_2.png" /></p>
190 </p>
191 <p><strong>以下是该问题的具体描述:</strong></p> 192 <p><strong>以下是该问题的具体描述:</strong></p>
192 <p><code>build.log</code>如下:</p> 193 <p><code>build.log</code>如下:</p>
193 <pre><code>Set cache size limit to 100.0 GB 194 <pre><code>Set cache size limit to 100.0 GB
@@ -294,7 +295,23 @@ targets := vmlinux</code></pre>
294 linux 文件,可能文件体积过大而尚未创建完成,所有页面一直驻留在内存中,导致内存崩溃。</p> 295 linux 文件,可能文件体积过大而尚未创建完成,所有页面一直驻留在内存中,导致内存崩溃。</p>
295 <p>总而言之,言而总之,在<code>VMware-&gt;虚拟机-&gt;设置-&gt;硬件-&gt;内存</code>中,把内存扩大,就可以完美解决该问题。经我的测试,内存 13.2G(主机总内存 16G 296 <p>总而言之,言而总之,在<code>VMware-&gt;虚拟机-&gt;设置-&gt;硬件-&gt;内存</code>中,把内存扩大,就可以完美解决该问题。经我的测试,内存 13.2G(主机总内存 16G
296 时候推荐的最大虚拟机内存)是能编译完成的,编译时长 6h。最终解决。</p> 297 时候推荐的最大虚拟机内存)是能编译完成的,编译时长 6h。最终解决。</p>
297 <h1 id="完结撒花">完结撒花 ❀</h1> 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或者重启终端
304source ~/.bashrc
305
306# 安装编译SDK需要的依赖包(编译镜像的时候是不依赖这些包的)
307sudo 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>
298 <p>本次鸿蒙开发环境的搭建过程可谓一波三折,总结几个最大的坑点,或许可以作为编译的经验罢:</p> 315 <p>本次鸿蒙开发环境的搭建过程可谓一波三折,总结几个最大的坑点,或许可以作为编译的经验罢:</p>
299 <ul> 316 <ul>
300 <li><strong>有报错,试试添加权限!</strong></li> 317 <li><strong>有报错,试试添加权限!</strong></li>
@@ -306,7 +323,7 @@ targets := vmlinux</code></pre>
306 </li> 323 </li>
307 </ul> 324 </ul>
308 <p>不说了,抓紧攒点钱开学升级电脑配置要紧……磁盘快炸了……</p> 325 <p>不说了,抓紧攒点钱开学升级电脑配置要紧……磁盘快炸了……</p>
309 <p class="time">2024.2.12<br>甲辰年正月初三</p> 326 <p class="time">2024.2.12甲辰年正月初三<br>2024.4.24改</p>
310 <script src="https://www.qin-juan-ge-zhu.top/common/js/comment.js"></script> 327 <script src="https://www.qin-juan-ge-zhu.top/common/js/comment.js"></script>
311 </div> 328 </div>
312 </div> 329 </div>
diff --git a/code/ohos/ohos_compile.md b/code/ohos/ohos_compile.md
index e7d2359..150ee25 100644
--- a/code/ohos/ohos_compile.md
+++ b/code/ohos/ohos_compile.md
@@ -22,6 +22,7 @@
22 - 源码大小就 36G 左右了 22 - 源码大小就 36G 左右了
23 - 大量的依赖会占据数十 G 的空间 23 - 大量的依赖会占据数十 G 的空间
24 - 我用的是 160G 磁盘,编译成功,但基本不剩什么空间了 24 - 我用的是 160G 磁盘,编译成功,但基本不剩什么空间了
25- 注意所需要的**ohos 的版本、cpu 版本、位数等信息**
25 26
26这里我用的是 VMWare+Ubuntu22.04 虚拟机。 27这里我用的是 VMWare+Ubuntu22.04 虚拟机。
27 28
@@ -31,15 +32,6 @@
31 32
32```bash 33```bash
33#!/bin/bash 34#!/bin/bash
34
35##########################################################################
36# File Name : harmony.sh
37# Encoding : utf-8
38# Author : We-unite
39# Email : weunite1848@gmail.com
40# Created Time : 2024-02-07 12:32:50
41##########################################################################
42
43set -e # 一旦出错立刻停止执行,不会执行后续指令 35set -e # 一旦出错立刻停止执行,不会执行后续指令
44 36
45# 更新软件源 37# 更新软件源
@@ -107,14 +99,18 @@ ssh-keygen -t rsa -C "your-email-address"
107 99
108此时,我们就可以通过 ssh 的方式与 gitee 进行交互、也可以免密提交代码了。 100此时,我们就可以通过 ssh 的方式与 gitee 进行交互、也可以免密提交代码了。
109 101
110# 配置 repo 工具 102# 系统源码编译
103
104## 配置 repo 工具
111 105
112**注意:前两条命令需要以 root 身份执行!!!** 106**注意:前两条命令需要以 root 身份执行!!!**
113 107
114```bash 108```bash
115# 以下两条命令需要以root身份执行 109# 以下两条命令需要以root身份执行
110sudo -s
116curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/repo 111curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/repo
117chmod a+x /usr/local/bin/repo 112chmod a+x /usr/local/bin/repo
113exit
118 114
119# 这条普通身份也可以 115# 这条普通身份也可以
120pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests 116pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests
@@ -122,17 +118,20 @@ pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests
122 118
123之所以前两条命令需要以 root 身份而不能是 sudo,是因为`/usr/local/bin`是一个只有 root 用户才有写权限的目录,而 sudo 命令虽然是以 root 身份执行,但**重定向时候 sudo 用的也是当前用户身份**,权限不足,自然报错。(**如果是管道,那么 sudo 也是只对当前命令有效,而不是对后续的整个管道有效。**) 119之所以前两条命令需要以 root 身份而不能是 sudo,是因为`/usr/local/bin`是一个只有 root 用户才有写权限的目录,而 sudo 命令虽然是以 root 身份执行,但**重定向时候 sudo 用的也是当前用户身份**,权限不足,自然报错。(**如果是管道,那么 sudo 也是只对当前命令有效,而不是对后续的整个管道有效。**)
124 120
125# 系统源码编译
126
127## 获取源码 121## 获取源码
128 122
129通过 repo + https/ssh 下载: 123通过 repo + https/ssh 下载:
130 124
131```bash 125```bash
132# 通过http下载 126# 通过http下载,这里需要注意你需要的ohos的版本
133repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify 127repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify
134# 或者也可以通过ssh下载 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下载
135# repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify 133# repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify
134
136repo sync -c 135repo sync -c
137repo forall -c 'git lfs pull' 136repo forall -c 'git lfs pull'
138``` 137```
@@ -143,12 +142,15 @@ repo forall -c 'git lfs pull'
143# 先在源码根目录下执行脚本,安装编译器及二进制工具 142# 先在源码根目录下执行脚本,安装编译器及二进制工具
144bash build/prebuilts_download.sh 143bash build/prebuilts_download.sh
145# 再执行如下命令进行版本编译 144# 再执行如下命令进行版本编译
145# 注意:默认编译的时候,目标cpu是32位,即使为64位cpu也无法使用64位功能
146sudo ./build.sh --product-name rk3568 --ccache 146sudo ./build.sh --product-name rk3568 --ccache
147# 如果是64位cpu,需要加上--target-cpu=arm64
148sudo ./build.sh --product-name rk3568 --ccache --target-cpu=arm64
147``` 149```
148 150
149## 编译完成 151## 编译完成
150 152
151编译所生成的文件都归档在 out 目录下,结果镜像输出在源码根目录下的 out/rk3568/packages/phone/images 目录下。 153编译所生成的文件都归档在 out 目录下,结果镜像输出在源码根目录下的`out/rk3568/packages/phone/images`目录下。
152 154
153自此源码编译成功,即可进行镜像烧录。 155自此源码编译成功,即可进行镜像烧录。
154 156
@@ -336,7 +338,77 @@ targets := vmlinux
336 338
337总而言之,言而总之,在`VMware->虚拟机->设置->硬件->内存`中,把内存扩大,就可以完美解决该问题。经我的测试,内存 13.2G(主机总内存 16G 时候推荐的最大虚拟机内存)是能编译完成的,编译时长 6h。最终解决。 339总而言之,言而总之,在`VMware->虚拟机->设置->硬件->内存`中,把内存扩大,就可以完美解决该问题。经我的测试,内存 13.2G(主机总内存 16G 时候推荐的最大虚拟机内存)是能编译完成的,编译时长 6h。最终解决。
338 340
339# 完结撒花 ❀ 341# ohos 的 NDK
342
343NDK 编译方式比较简单,在源码根目录下执行如下命令:
344
345```bash
346# 安装依赖
347./build/build_scripts/env_setup.sh
348
349# 执行完上述命令后记得执行source ~/.bashrc或者重启终端
350source ~/.bashrc
351
352# 安装编译SDK需要的依赖包(编译镜像的时候是不依赖这些包的)
353sudo apt-get install libxcursor-dev libxrandr-dev libxinerama-dev
354
355./build.sh --product-name ohos-sdk --ccache --build-target ohos_ndk
356```
357
358编译出来的 NDK 在`out/sdk/packages/ohos-sdk/linux/native`下。当然同时也有 windows 版本的 NDK,你猜在哪里?
359
360将编译出来的 NDK 的 zip 解压到你想要的目录下,然后将该目录添加到环境变量中,即可使用。
361
362注意,NDK 包提供的交叉编译工具是 cmake 和 ninja,编译器是 clang 和 clang++,并没有我们熟悉的 gcc/g++和 make。除此之外,NDK 还未我们提供编译所需的全套服务,如编译工具链配置文件`ohos.toolchain.cmake`、头文件、库文件等。快说,谢谢 ohos~
363
364为了更方便地使用NDK,鄙人不才,写了两个脚本,分别用于cmake编译和单文件编译:
365
366```bash
367#!/bin/bash
368
369##########################################################################
370# File Name : compile.sh
371# Encoding : utf-8
372# Author : We-unite
373# Email : weunite1848@gmail.com
374# Created Time : 2024-02-29 15:19:15
375##########################################################################
376
377set -e
378
379if [ $UID -eq 0 ]; then
380 echo "Please do not run this script as root"
381 exit 1
382fi
383
384if [ $# -ne 2 ]; then
385 echo "Usage: $0 <static|shared> <v7|v8>"
386 exit 1
387fi
388
389if [ $2 == "v8" ]; then
390 arch=arm64-v8a
391elif [ $2 == "v7" ]; then
392 arch=armeabi-v7a
393else
394 echo "Invalid architecture: $2"
395 exit 1
396fi
397
398link=$1 # static or shared
399native_path=~/app/native
400
401export PATH=$native_path/build-tools/cmake/bin:$PATH
402
403# 使用cmake编译,编译生成的文件运行在rk3568上
404cmake -B build -D OHOS_STL=c++_$link -D OHOS_ARCH=$arch -D OHOS_PLATFORM=OHOS -D CMAKE_TOOLCHAIN_FILE=$(find $native_path -name ohos.toolchain.cmake)
405cmake --build build
406```
407
408```bash
409```
410
411# 完结撒花
340 412
341本次鸿蒙开发环境的搭建过程可谓一波三折,总结几个最大的坑点,或许可以作为编译的经验罢: 413本次鸿蒙开发环境的搭建过程可谓一波三折,总结几个最大的坑点,或许可以作为编译的经验罢:
342 414
@@ -345,4 +417,4 @@ targets := vmlinux
345 - 内存 10G+ 417 - 内存 10G+
346 - 磁盘 160G+ 418 - 磁盘 160G+
347 419
348不说了,抓紧攒点钱开学升级电脑配置要紧……磁盘快炸了…… 420不说了,抓紧攒点钱开学升级电脑配置要紧……磁盘快炸了…… \ No newline at end of file
diff --git a/common/html2js.c b/common/html2js.c
index 1f38a45..f6bf46c 100644
--- a/common/html2js.c
+++ b/common/html2js.c
@@ -2,8 +2,7 @@
2#include <stdlib.h> 2#include <stdlib.h>
3#include <string.h> 3#include <string.h>
4#include <unistd.h> 4#include <unistd.h>
5void html2js(char file_name[]) 5void html2js(char file_name[]) {
6{
7 FILE *html, *js; 6 FILE *html, *js;
8 char buf[1024]; 7 char buf[1024];
9 size_t i, len; 8 size_t i, len;
@@ -11,27 +10,22 @@ void html2js(char file_name[])
11 strcpy(tmp, file_name); 10 strcpy(tmp, file_name);
12 html = fopen(strcat(tmp, ".html"), "r"); 11 html = fopen(strcat(tmp, ".html"), "r");
13 js = fopen(strcat(file_name, ".js"), "w"); 12 js = fopen(strcat(file_name, ".js"), "w");
14 if (html == NULL || js == NULL) 13 if (html == NULL || js == NULL) {
15 {
16 printf("ERROR:Fail to open file!\n"); 14 printf("ERROR:Fail to open file!\n");
17 exit(1); 15 exit(1);
18 } 16 }
19 while (!feof(html)) 17 while (!feof(html)) {
20 {
21 memset(buf, '\0', 1024); 18 memset(buf, '\0', 1024);
22 fgets(buf, 1024, html); 19 fgets(buf, 1024, html);
23 len = strlen(buf); 20 len = strlen(buf);
24 fprintf(js, "document.writeln(\""); 21 fprintf(js, "document.writeln(\"");
25 for (i = 0; i < len - 1; i++) 22 for (i = 0; i < len - 1; i++) {
26 { 23 if (buf[i] == '\"' || buf[i] == '\'') {
27 if (buf[i] == '\"' || buf[i] == '\'')
28 {
29 fprintf(js, "\\"); 24 fprintf(js, "\\");
30 } 25 }
31 fprintf(js, "%c", buf[i]); 26 fprintf(js, "%c", buf[i]);
32 } 27 }
33 if (buf[i] != '\n') 28 if (buf[i] != '\n') {
34 {
35 fprintf(js, "%c", buf[i]); 29 fprintf(js, "%c", buf[i]);
36 } 30 }
37 fprintf(js, "\");\n"); 31 fprintf(js, "\");\n");
@@ -40,12 +34,11 @@ void html2js(char file_name[])
40 fclose(js); 34 fclose(js);
41 printf("Success!\n"); 35 printf("Success!\n");
42} 36}
43int main() 37int main() {
44{
45 char file_name[30]; 38 char file_name[30];
46 strcpy(file_name, "script4code"); 39 strcpy(file_name, "common/script4code");
47 html2js(file_name); 40 html2js(file_name);
48 strcpy(file_name, "script4works"); 41 strcpy(file_name, "common/script4works");
49 html2js(file_name); 42 html2js(file_name);
50 return 0; 43 return 0;
51} 44}
diff --git a/common/script4works.html b/common/script4works.html
index 330cb42..0080751 100644
--- a/common/script4works.html
+++ b/common/script4works.html
@@ -100,9 +100,9 @@
100 d="M923.2 289.6c0 354.4-232.8 609.6-575.2 620.8-144.8 11.2-244-32.8-332.8-99.2 99.2 11.2 232.8-21.6 298.4-88.8-99.2 0-155.2-56-188-132h88.8C125.6 556.8 58.4 490.4 58.4 380c21.6 11.2 44 21.6 88.8 21.6-77.6-44-121.6-188-66.4-276.8 99.2 110.4 220.8 210.4 421.6 220.8-56-220.8 232.8-332.8 354.4-188 56-11.2 88.8-32.8 132-56-11.2 56-44 88.8-88.8 110.4 44 0 77.6-11.2 110.4-32.8-10.4 44-54.4 88.8-87.2 110.4z" 100 d="M923.2 289.6c0 354.4-232.8 609.6-575.2 620.8-144.8 11.2-244-32.8-332.8-99.2 99.2 11.2 232.8-21.6 298.4-88.8-99.2 0-155.2-56-188-132h88.8C125.6 556.8 58.4 490.4 58.4 380c21.6 11.2 44 21.6 88.8 21.6-77.6-44-121.6-188-66.4-276.8 99.2 110.4 220.8 210.4 421.6 220.8-56-220.8 232.8-332.8 354.4-188 56-11.2 88.8-32.8 132-56-11.2 56-44 88.8-88.8 110.4 44 0 77.6-11.2 110.4-32.8-10.4 44-54.4 88.8-87.2 110.4z"
101 fill="" p-id="3318"></path> 101 fill="" p-id="3318"></path>
102 </svg></a> 102 </svg></a>
103 <a target="_blank" href="mailto:3205135446@qq.com" data-tooltip="勤倦阁主"><svg t="1603709790743" class="icon" 103 <a target="_blank" href="mailto:3205135446@qq.com" data-tooltip="勤倦阁主"><svg t="1603709790743"
104 viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5171" width="128" 104 class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"
105 height="128"> 105 p-id="5171" width="128" height="128">
106 <path 106 <path
107 d="M853.333 187.733H170.667A111.019 111.019 0 0 0 59.733 298.667v426.666c0 61.184 49.792 110.934 110.934 110.934h682.666c61.184 0 110.934-49.792 110.934-110.934V298.667c0-61.184-49.75-110.934-110.934-110.934z m59.734 537.6c0 32.939-26.838 59.734-59.734 59.734H170.667c-32.939 0-59.734-26.795-59.734-59.734V298.667c0-32.939 26.795-59.734 59.734-59.734h682.666c32.896 0 59.734 26.795 59.734 59.734v426.666z m-81.622-368.298a25.6 25.6 0 0 1-5.888 35.712L552.62 588.757a68.267 68.267 0 0 1-79.446 0.171l-274.73-196.139a25.6 25.6 0 0 1 29.738-41.685L502.87 547.2a17.067 17.067 0 0 0 19.883-0.043l272.981-196.01a25.6 25.6 0 0 1 35.712 5.888z" 107 d="M853.333 187.733H170.667A111.019 111.019 0 0 0 59.733 298.667v426.666c0 61.184 49.792 110.934 110.934 110.934h682.666c61.184 0 110.934-49.792 110.934-110.934V298.667c0-61.184-49.75-110.934-110.934-110.934z m59.734 537.6c0 32.939-26.838 59.734-59.734 59.734H170.667c-32.939 0-59.734-26.795-59.734-59.734V298.667c0-32.939 26.795-59.734 59.734-59.734h682.666c32.896 0 59.734 26.795 59.734 59.734v426.666z m-81.622-368.298a25.6 25.6 0 0 1-5.888 35.712L552.62 588.757a68.267 68.267 0 0 1-79.446 0.171l-274.73-196.139a25.6 25.6 0 0 1 29.738-41.685L502.87 547.2a17.067 17.067 0 0 0 19.883-0.043l272.981-196.01a25.6 25.6 0 0 1 35.712 5.888z"
108 fill="" p-id="5172"></path> 108 fill="" p-id="5172"></path>
@@ -117,7 +117,7 @@
117 同时,每一代的子代应放在统一的div内,不得分别存放。 117 同时,每一代的子代应放在统一的div内,不得分别存放。
118 div内不同个体均以a标签包裹,如还有子代则点击时不可跳转,要求不写href属性 118 div内不同个体均以a标签包裹,如还有子代则点击时不可跳转,要求不写href属性
119 每个有祖先的div都需要写style="display:none",否则会出现bug 119 每个有祖先的div都需要写style="display:none",否则会出现bug
120 有子代的,子代的dic紧随其后,不得乱放 --> 120 有子代的,子代的div紧随其后,不得乱放 -->
121 121
122 122
123 <div class="main-menu" id="main1" onclick="clickit('child1')">-个人作品</div> 123 <div class="main-menu" id="main1" onclick="clickit('child1')">-个人作品</div>
@@ -149,15 +149,21 @@
149 </div> 149 </div>
150 <a onclick="clickit('grandson22')">-一些小玩意儿</a> 150 <a onclick="clickit('grandson22')">-一些小玩意儿</a>
151 <div class="grandson" id="grandson22" style="display: none;"> 151 <div class="grandson" id="grandson22" style="display: none;">
152 <a href="https://www.qin-juan-ge-zhu.top/code/ohos/ohos_compile.html">OpenHarmony编译</a>
153 <a href="https://www.qin-juan-ge-zhu.top/code/highlight.html">代码高亮与复制</a> 152 <a href="https://www.qin-juan-ge-zhu.top/code/highlight.html">代码高亮与复制</a>
154 <a href="https://www.qin-juan-ge-zhu.top/code/index.html">C的小零件</a> 153 <a href="https://www.qin-juan-ge-zhu.top/code/index.html">C的小零件</a>
155 <a href="https://www.qin-juan-ge-zhu.top/code/cpppp.html">C++ Primer Plus基础</a> 154 <a href="https://www.qin-juan-ge-zhu.top/code/cpppp.html">C++ Primer Plus基础</a>
156 <a href="https://www.qin-juan-ge-zhu.top/code/experiment.html">大物实验MATLAB</a> 155 <a href="https://www.qin-juan-ge-zhu.top/code/experiment.html">大物实验MATLAB</a>
157 <a href="https://www.qin-juan-ge-zhu.top/code/zeal.html">Zeal文档下载</a> 156 <a href="https://www.qin-juan-ge-zhu.top/code/zeal.html">Zeal文档下载</a>
158 </div> 157 </div>
159 <a onclick="clickit('grandson23')">-功能网页</a> 158
160 <div class="grandson" id="grandson23" style="display:none"> 159 <a onclick="clickit('grandson23')">-OHOS 文档</a>
160 <div class="grandson" id="grandson23" style="display: none;">
161 <a href="https://www.qin-juan-ge-zhu.top/code/ohos/ohos_compile.html">OpenHarmony编译</a>
162 <a href="https://www.qin-juan-ge-zhu.top/code/ohos/lcm_compile.html">LCM交叉编译/a>
163 </div>
164
165 <a onclick="clickit('grandson24')">-功能网页</a>
166 <div class="grandson" id="grandson24" style="display:none">
161 <a href="https://code.qin-juan-ge-zhu.top">VSCode Online</a> 167 <a href="https://code.qin-juan-ge-zhu.top">VSCode Online</a>
162 <a href="https://git.qin-juan-ge-zhu.top">Git托管存储室</a> 168 <a href="https://git.qin-juan-ge-zhu.top">Git托管存储室</a>
163 <a href="https://file.qin-juan-ge-zhu.top">服务器文件浏览</a> 169 <a href="https://file.qin-juan-ge-zhu.top">服务器文件浏览</a>
diff --git a/common/script4works.js b/common/script4works.js
index 9199217..68090f1 100644
--- a/common/script4works.js
+++ b/common/script4works.js
@@ -101,9 +101,9 @@ document.writeln(" <path");
101document.writeln(" d=\"M923.2 289.6c0 354.4-232.8 609.6-575.2 620.8-144.8 11.2-244-32.8-332.8-99.2 99.2 11.2 232.8-21.6 298.4-88.8-99.2 0-155.2-56-188-132h88.8C125.6 556.8 58.4 490.4 58.4 380c21.6 11.2 44 21.6 88.8 21.6-77.6-44-121.6-188-66.4-276.8 99.2 110.4 220.8 210.4 421.6 220.8-56-220.8 232.8-332.8 354.4-188 56-11.2 88.8-32.8 132-56-11.2 56-44 88.8-88.8 110.4 44 0 77.6-11.2 110.4-32.8-10.4 44-54.4 88.8-87.2 110.4z\""); 101document.writeln(" d=\"M923.2 289.6c0 354.4-232.8 609.6-575.2 620.8-144.8 11.2-244-32.8-332.8-99.2 99.2 11.2 232.8-21.6 298.4-88.8-99.2 0-155.2-56-188-132h88.8C125.6 556.8 58.4 490.4 58.4 380c21.6 11.2 44 21.6 88.8 21.6-77.6-44-121.6-188-66.4-276.8 99.2 110.4 220.8 210.4 421.6 220.8-56-220.8 232.8-332.8 354.4-188 56-11.2 88.8-32.8 132-56-11.2 56-44 88.8-88.8 110.4 44 0 77.6-11.2 110.4-32.8-10.4 44-54.4 88.8-87.2 110.4z\"");
102document.writeln(" fill=\"\" p-id=\"3318\"></path>"); 102document.writeln(" fill=\"\" p-id=\"3318\"></path>");
103document.writeln(" </svg></a>"); 103document.writeln(" </svg></a>");
104document.writeln(" <a target=\"_blank\" href=\"mailto:3205135446@qq.com\" data-tooltip=\"勤倦阁主\"><svg t=\"1603709790743\" class=\"icon\""); 104document.writeln(" <a target=\"_blank\" href=\"mailto:3205135446@qq.com\" data-tooltip=\"勤倦阁主\"><svg t=\"1603709790743\"");
105document.writeln(" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"5171\" width=\"128\""); 105document.writeln(" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"");
106document.writeln(" height=\"128\">"); 106document.writeln(" p-id=\"5171\" width=\"128\" height=\"128\">");
107document.writeln(" <path"); 107document.writeln(" <path");
108document.writeln(" d=\"M853.333 187.733H170.667A111.019 111.019 0 0 0 59.733 298.667v426.666c0 61.184 49.792 110.934 110.934 110.934h682.666c61.184 0 110.934-49.792 110.934-110.934V298.667c0-61.184-49.75-110.934-110.934-110.934z m59.734 537.6c0 32.939-26.838 59.734-59.734 59.734H170.667c-32.939 0-59.734-26.795-59.734-59.734V298.667c0-32.939 26.795-59.734 59.734-59.734h682.666c32.896 0 59.734 26.795 59.734 59.734v426.666z m-81.622-368.298a25.6 25.6 0 0 1-5.888 35.712L552.62 588.757a68.267 68.267 0 0 1-79.446 0.171l-274.73-196.139a25.6 25.6 0 0 1 29.738-41.685L502.87 547.2a17.067 17.067 0 0 0 19.883-0.043l272.981-196.01a25.6 25.6 0 0 1 35.712 5.888z\""); 108document.writeln(" d=\"M853.333 187.733H170.667A111.019 111.019 0 0 0 59.733 298.667v426.666c0 61.184 49.792 110.934 110.934 110.934h682.666c61.184 0 110.934-49.792 110.934-110.934V298.667c0-61.184-49.75-110.934-110.934-110.934z m59.734 537.6c0 32.939-26.838 59.734-59.734 59.734H170.667c-32.939 0-59.734-26.795-59.734-59.734V298.667c0-32.939 26.795-59.734 59.734-59.734h682.666c32.896 0 59.734 26.795 59.734 59.734v426.666z m-81.622-368.298a25.6 25.6 0 0 1-5.888 35.712L552.62 588.757a68.267 68.267 0 0 1-79.446 0.171l-274.73-196.139a25.6 25.6 0 0 1 29.738-41.685L502.87 547.2a17.067 17.067 0 0 0 19.883-0.043l272.981-196.01a25.6 25.6 0 0 1 35.712 5.888z\"");
109document.writeln(" fill=\"\" p-id=\"5172\"></path>"); 109document.writeln(" fill=\"\" p-id=\"5172\"></path>");
@@ -118,7 +118,7 @@ document.writeln(" 要求:id严禁重复,每一代的子代必须具
118document.writeln(" 同时,每一代的子代应放在统一的div内,不得分别存放。"); 118document.writeln(" 同时,每一代的子代应放在统一的div内,不得分别存放。");
119document.writeln(" div内不同个体均以a标签包裹,如还有子代则点击时不可跳转,要求不写href属性"); 119document.writeln(" div内不同个体均以a标签包裹,如还有子代则点击时不可跳转,要求不写href属性");
120document.writeln(" 每个有祖先的div都需要写style=\"display:none\",否则会出现bug"); 120document.writeln(" 每个有祖先的div都需要写style=\"display:none\",否则会出现bug");
121document.writeln(" 有子代的,子代的dic紧随其后,不得乱放 -->"); 121document.writeln(" 有子代的,子代的div紧随其后,不得乱放 -->");
122document.writeln(""); 122document.writeln("");
123document.writeln(""); 123document.writeln("");
124document.writeln(" <div class=\"main-menu\" id=\"main1\" onclick=\"clickit(\'child1\')\">-个人作品</div>"); 124document.writeln(" <div class=\"main-menu\" id=\"main1\" onclick=\"clickit(\'child1\')\">-个人作品</div>");
@@ -150,15 +150,21 @@ document.writeln(" <a href=\"https://www.qin-juan-ge-zhu.top/code
150document.writeln(" </div>"); 150document.writeln(" </div>");
151document.writeln(" <a onclick=\"clickit(\'grandson22\')\">-一些小玩意儿</a>"); 151document.writeln(" <a onclick=\"clickit(\'grandson22\')\">-一些小玩意儿</a>");
152document.writeln(" <div class=\"grandson\" id=\"grandson22\" style=\"display: none;\">"); 152document.writeln(" <div class=\"grandson\" id=\"grandson22\" style=\"display: none;\">");
153document.writeln(" <a href=\"https://www.qin-juan-ge-zhu.top/code/ohos/ohos_compile.html\">OpenHarmony编译</a>");
154document.writeln(" <a href=\"https://www.qin-juan-ge-zhu.top/code/highlight.html\">代码高亮与复制</a>"); 153document.writeln(" <a href=\"https://www.qin-juan-ge-zhu.top/code/highlight.html\">代码高亮与复制</a>");
155document.writeln(" <a href=\"https://www.qin-juan-ge-zhu.top/code/index.html\">C的小零件</a>"); 154document.writeln(" <a href=\"https://www.qin-juan-ge-zhu.top/code/index.html\">C的小零件</a>");
156document.writeln(" <a href=\"https://www.qin-juan-ge-zhu.top/code/cpppp.html\">C++ Primer Plus基础</a>"); 155document.writeln(" <a href=\"https://www.qin-juan-ge-zhu.top/code/cpppp.html\">C++ Primer Plus基础</a>");
157document.writeln(" <a href=\"https://www.qin-juan-ge-zhu.top/code/experiment.html\">大物实验MATLAB</a>"); 156document.writeln(" <a href=\"https://www.qin-juan-ge-zhu.top/code/experiment.html\">大物实验MATLAB</a>");
158document.writeln(" <a href=\"https://www.qin-juan-ge-zhu.top/code/zeal.html\">Zeal文档下载</a>"); 157document.writeln(" <a href=\"https://www.qin-juan-ge-zhu.top/code/zeal.html\">Zeal文档下载</a>");
159document.writeln(" </div>"); 158document.writeln(" </div>");
160document.writeln(" <a onclick=\"clickit(\'grandson23\')\">-功能网页</a>"); 159document.writeln("");
161document.writeln(" <div class=\"grandson\" id=\"grandson23\" style=\"display:none\">"); 160document.writeln(" <a onclick=\"clickit(\'grandson23\')\">-OHOS 文档</a>");
161document.writeln(" <div class=\"grandson\" id=\"grandson23\" style=\"display: none;\">");
162document.writeln(" <a href=\"https://www.qin-juan-ge-zhu.top/code/ohos/ohos_compile.html\">OpenHarmony编译</a>");
163document.writeln(" <a href=\"https://www.qin-juan-ge-zhu.top/code/ohos/lcm_compile.html\">LCM交叉编译/a>");
164document.writeln(" </div>");
165document.writeln("");
166document.writeln(" <a onclick=\"clickit(\'grandson24\')\">-功能网页</a>");
167document.writeln(" <div class=\"grandson\" id=\"grandson24\" style=\"display:none\">");
162document.writeln(" <a href=\"https://code.qin-juan-ge-zhu.top\">VSCode Online</a>"); 168document.writeln(" <a href=\"https://code.qin-juan-ge-zhu.top\">VSCode Online</a>");
163document.writeln(" <a href=\"https://git.qin-juan-ge-zhu.top\">Git托管存储室</a>"); 169document.writeln(" <a href=\"https://git.qin-juan-ge-zhu.top\">Git托管存储室</a>");
164document.writeln(" <a href=\"https://file.qin-juan-ge-zhu.top\">服务器文件浏览</a>"); 170document.writeln(" <a href=\"https://file.qin-juan-ge-zhu.top\">服务器文件浏览</a>");