From 911305a600e37a42acf69037b313912178c7010d Mon Sep 17 00:00:00 2001 From: We-unite <3205135446@qq.com> Date: Sat, 25 May 2024 10:52:52 +0800 Subject: Add LCM cross-compile. lcm cross-compile method is now right, but missing glib2 while compiling it. It should be solved next time. --- code/ohos/lcm_compile.html | 119 +++++++++++++++++++++++++++++++++++++ code/ohos/lcm_compile.md | 141 ++++++++++++++++++++++++++++++++++++++++++++ code/ohos/ohos_compile.html | 63 ++++++++++++-------- code/ohos/ohos_compile.md | 106 +++++++++++++++++++++++++++------ common/html2js.c | 25 +++----- common/script4works.html | 20 ++++--- common/script4works.js | 20 ++++--- 7 files changed, 424 insertions(+), 70 deletions(-) create mode 100644 code/ohos/lcm_compile.html create mode 100644 code/ohos/lcm_compile.md 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 @@ + + + + + + + + LCM 交叉编译 + + + + + + +
+
+

LCM 交叉编译

+ +

LCM 简介

+

LCM(Lightweight Communications and + Marshalling)是一种轻量级的通信和编组库,是一种针对高带宽、低延迟、实时性要求高的场景下的通讯工具,用于在多个进程之间传递消息。LCM 的设计目标是提供一种简单的方法来传递结构化数据,而不需要复杂的 + API 或协议定义。LCM 的消息传递是基于发布/订阅模型的,发布者和订阅者之间通过一个中心化的消息传递系统进行通信。

+

在机器人和自动驾驶系统中,LCM 可作为 ROS 的替代品,借以完成进程间、设备间的通讯。

+

为了方便地在不同进程、不同设备间传递数据,我们在 OHOS 系统中集成了 LCM 模块。

+

参考文档:

+ +

依赖项安装

+
sudo apt update
+sudo apt upgrade
+sudo apt install build-essential cmake libglib2.0-dev
+sudo apt install openjdk-8-jdk # lcm仅支持jdk8
+

x86 的 lcm

+

如果我们仅仅需要 x86 架构的 lcm,执行下列命令即可:

+
git clone https://github.com/lcm-proj/lcm
+cd lcm
+mkdir build && cd build
+cmake ..
+make
+sudo make install
+

编译完成后,注意观察build目录下是否有lcm-java文件夹,如果没有,证明没有安装 java 或者 java 版本不对。

+

lcm-python

+

若想使用lcm-python,在lcm/lcm-python下执行sudo python3 setup.py install即可,使用时import python。 +

+

lcm-spy 的使用

+

lcm-spy 是 LCM 配套的数据可视化工具。 可以通过 lcm-spy 监视 lcm 数据发送频率、数据量、数据结构,甚至实时画图。 如果安装了 JAVA,则 lcm-spy 会连同 LCM 一同被安装。 +

+

启动 lcm-spy:

+
export CLASSPATH=${your lcm-type class path}
+lcm-spy
+

交叉编译

+

既然 lcm 用的是 cmake,何不交叉编译到 OHOS 里用呢?

+

首先,我们可以设置一下 Native Development Kit(NDK)的路径:

+
# 设置成自己的NDK工具目录
+export OHOS_ROOT=~/app/native
+
$OHOS_ROOT/build-tools/cmake/bin/cmake \
+      -DOHOS_STL=c++_shared \
+      -DOHOS_ARCH=armv8-a \
+      -DOHOS_PLATFORM=OHOS \
+      -DCMAKE_TOOLCHAIN_FILE=$(find $OHOS_ROOT -name "ohos.toolchain.cmake")
+

不出意外的话,就要出意外了。果不其然,报错Could NOT fid Glib2。思考之后,我们认为,问题出现在 lcm 所依赖的 glib 库上:在 x86 + 架构上,我们直接向系统安装了libglib2.0-dev,而 lcm 编译时直接从系统里找到了这个库;但当交叉编译时,由于 OHOS 交叉编译工具未提供 + libglib2.0-dev,lcm 找遍了系统也没找到 arm 架构下的这个库,因而直接报错。

+

解决方案自然是自己手动交叉编译libglib2.0-dev

+

Glib2.0 交叉编译

+

官网下载 glib-2.79.2 源码,解压后进入源码目录。

+
mkdir glib && cd glib
+wget https://download.gnome.org/sources/glib/2.79/glib-2.79.2.tar.xz
+tar -xvf glib-2.79.2.tar.xz
+mkdir build
+

这里需要注意的是:

+ +

接着,参考博客这篇博客,撰写如下meson_ohos.txt(友情提醒,使用该文件时把native也就是 + NDK 的路径修改为自己的路径、源平台与目标平台按需修改):

+
[binaries]
+c = '$OHOS_ROOT/llvm/bin/aarch64-unknown-linux-ohos-clang'
+cpp = '$OHOS_ROOT/llvm/bin/aarch64-unknown-linux-ohos-clang++'
+ar = '$OHOS_ROOT/llvm/bin/llvm-ar'
+strip = '$OHOS_ROOT/llvm/bin/llvm-strip'
+ld = '$OHOS_ROOT/llvm/bin/llvm-link'
+
+[properties]
+skip_sanity_check = true
+sys_root = '$OHOS_ROOT/sysroot'
+c_args = ['-L$OHOS_ROOT/sysroot/usr/lib/aarch64-linux-ohos']
+
+[host_machine]
+system = 'linux'
+cpu_family = 'aarch64'
+cpu = 'aarch64'
+endian = 'little'
+
+[target_machine]
+system = 'ohos'
+cpu_family = 'aarch64'
+cpu = 'armv8a'
+endian = 'little'
+

将该文件放置在glib-2.79.2源码目录下,而后在build目录下执行以下命令:

+
meson --cross-file=../glib-2.79.2/meson_ohos.txt ..
+ninja
+

编译完成,正确地安装 glib2 到交叉编译工具链中(???),之后我们回到 lcm 的源码目录,重新执行 cmake 命令:

+
$OHOS_ROOT/build-tools/cmake/bin/cmake \
+      -DOHOS_STL=c++_shared \
+      -DOHOS_ARCH=armv8-a \
+      -DOHOS_PLATFORM=OHOS \
+      -DCMAKE_TOOLCHAIN_FILE=$(find $OHOS_ROOT -name "ohos.toolchain.cmake")
+

这次,编译成功了。万岁!

+ +
+
+ + + \ 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 @@ + + +# LCM 简介 + +LCM(Lightweight Communications and Marshalling)是一种轻量级的通信和编组库,是一种针对高带宽、低延迟、实时性要求高的场景下的通讯工具,用于在多个进程之间传递消息。LCM 的设计目标是提供一种简单的方法来传递结构化数据,而不需要复杂的 API 或协议定义。LCM 的消息传递是基于发布/订阅模型的,发布者和订阅者之间通过一个中心化的消息传递系统进行通信。 + +在机器人和自动驾驶系统中,LCM 可作为 ROS 的替代品,借以完成进程间、设备间的通讯。 + +为了方便地在不同进程、不同设备间传递数据,我们在 OHOS 系统中集成了 LCM 模块。 + +参考文档: + +- [LCM 官方文档](https://lcm-proj.github.io/) +- [一篇博客](https://zhuanlan.zhihu.com/p/621943685) + +# 依赖项安装 + +```bash +sudo apt update +sudo apt upgrade +sudo apt install build-essential cmake libglib2.0-dev +sudo apt install openjdk-8-jdk # lcm仅支持jdk8 +``` + +# x86 的 lcm + +如果我们仅仅需要 x86 架构的 lcm,执行下列命令即可: + +```bash +git clone https://github.com/lcm-proj/lcm +cd lcm +mkdir build && cd build +cmake .. +make +sudo make install +``` + +编译完成后,注意观察build目录下是否有lcm-java文件夹,如果没有,证明没有安装 java 或者 java 版本不对。 + +## lcm-python + +若想使用lcm-python,在lcm/lcm-python下执行`sudo python3 setup.py install`即可,使用时`import python`。 + +## lcm-spy 的使用 + +lcm-spy 是 LCM 配套的数据可视化工具。 +可以通过 lcm-spy 监视 lcm 数据发送频率、数据量、数据结构,甚至实时画图。 +如果安装了 JAVA,则 lcm-spy 会连同 LCM 一同被安装。 + +启动 lcm-spy: + +```bash +export CLASSPATH=${your lcm-type class path} +lcm-spy +``` + +# 交叉编译 + +既然 lcm 用的是 cmake,何不交叉编译到 OHOS 里用呢? + +首先,我们可以设置一下 Native Development Kit(NDK)的路径: + +```bash +# 设置成自己的NDK工具目录 +export OHOS_ROOT=~/app/native +``` + +```bash +$OHOS_ROOT/build-tools/cmake/bin/cmake \ + -DOHOS_STL=c++_shared \ + -DOHOS_ARCH=armv8-a \ + -DOHOS_PLATFORM=OHOS \ + -DCMAKE_TOOLCHAIN_FILE=$(find $OHOS_ROOT -name "ohos.toolchain.cmake") +``` + +不出意外的话,就要出意外了。果不其然,报错Could NOT fid Glib2。思考之后,我们认为,问题出现在 lcm 所依赖的 glib 库上:在 x86 架构上,我们直接向系统安装了`libglib2.0-dev`,而 lcm 编译时直接从系统里找到了这个库;但当交叉编译时,由于 OHOS 交叉编译工具未提供 libglib2.0-dev,lcm 找遍了系统也没找到 arm 架构下的这个库,因而直接报错。 + +解决方案自然是自己手动交叉编译`libglib2.0-dev`。 + +## Glib2.0 交叉编译 + +从[官网](https://download.gnome.org/sources/glib/)下载 glib-2.79.2 源码,解压后进入源码目录。 + +```bash +mkdir glib && cd glib +wget https://download.gnome.org/sources/glib/2.79/glib-2.79.2.tar.xz +tar -xvf glib-2.79.2.tar.xz +mkdir build +``` + +这里需要注意的是: + +- 虽然 glib 编译需要`meson`,但它并不能直接交叉编译,OHOS 也并未提供用于交叉编译的`meson`。 +- `meson`要求保证源码目录与构建目录不能相同,以保证构建过程的干净,因此我们在源码目录外新建了一个`build`目录。 + +接着,参考博客[这篇博客](https://t.csdnimg.cn/YfSJC),撰写如下meson_ohos.txt(友情提醒,使用该文件时把native也就是 NDK 的路径修改为自己的路径、源平台与目标平台按需修改): + +```meson +[binaries] +c = '$OHOS_ROOT/llvm/bin/aarch64-unknown-linux-ohos-clang' +cpp = '$OHOS_ROOT/llvm/bin/aarch64-unknown-linux-ohos-clang++' +ar = '$OHOS_ROOT/llvm/bin/llvm-ar' +strip = '$OHOS_ROOT/llvm/bin/llvm-strip' +ld = '$OHOS_ROOT/llvm/bin/llvm-link' + +[properties] +skip_sanity_check = true +sys_root = '$OHOS_ROOT/sysroot' +c_args = ['-L$OHOS_ROOT/sysroot/usr/lib/aarch64-linux-ohos'] + +[host_machine] +system = 'linux' +cpu_family = 'aarch64' +cpu = 'aarch64' +endian = 'little' + +[target_machine] +system = 'ohos' +cpu_family = 'aarch64' +cpu = 'armv8a' +endian = 'little' +``` + +将该文件放置在glib-2.79.2源码目录下,而后在build目录下执行以下命令: + +```bash +meson --cross-file=../glib-2.79.2/meson_ohos.txt .. +ninja +``` + +编译完成,正确地安装 glib2 到交叉编译工具链中(???),之后我们回到 lcm 的源码目录,重新执行 cmake 命令: + +```bash +$OHOS_ROOT/build-tools/cmake/bin/cmake \ + -DOHOS_STL=c++_shared \ + -DOHOS_ARCH=armv8-a \ + -DOHOS_PLATFORM=OHOS \ + -DCMAKE_TOOLCHAIN_FILE=$(find $OHOS_ROOT -name "ohos.toolchain.cmake") +``` + +这次,编译成功了。万岁! 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 @@ - Open Harmony 编译 + OpenHarmony 3.2 编译 @@ -15,9 +15,10 @@
-

Open Harmony 编译

+

OpenHarmony 3.2 编译

+

[toc]

本次编译环境搭建参考了以下博客:

    @@ -38,8 +39,7 @@

    硬件环境

    编译过程使用的是 Ubuntu,经测试,Ubuntu 22.04 LTS/Ubuntu 20.04 LTS/Ubuntu 18.04 LTS - 均可用。 -

    + 均可用。

    网上的大多数博客里没有对编译的硬件限制作出说明,现根据我们的情况,给出一个大概的范围:

    • 内存必须在 10G 以上,我使用的是 13G,编译成功(8G 时编译失败了,下文会说明)
    • @@ -50,20 +50,12 @@
    • 我用的是 160G 磁盘,编译成功,但基本不剩什么空间了
    +
  • 注意所需要的ohos 的版本、cpu 版本、位数等信息

这里我用的是 VMWare+Ubuntu22.04 虚拟机。

软件包依赖

安装依赖在博客中都有讲,但少了一部分依赖项,我因而将所有必要的依赖项整理到一个脚本里了:

#!/bin/bash
-
-##########################################################################
-# File Name    : harmony.sh
-# Encoding     : utf-8
-# Author       : We-unite
-# Email        : weunite1848@gmail.com
-# Created Time : 2024-02-07 12:32:50
-##########################################################################
-
 set -e # 一旦出错立刻停止执行,不会执行后续指令
 
 # 更新软件源
@@ -115,33 +107,43 @@ ssh-keygen -t rsa -C "your-email-address"
密钥对的公钥和私钥分别保存在~/.ssh/id_rsa.pub~/.ssh/id_rsa中。

在 gitee 用户的设置界面,将公钥id_rsa.pub的内容复制到 gitee 的 SSH 公钥中,保存即可。

此时,我们就可以通过 ssh 的方式与 gitee 进行交互、也可以免密提交代码了。

-

配置 repo 工具

+

系统源码编译

+

配置 repo 工具

注意:前两条命令需要以 root 身份执行!!!

# 以下两条命令需要以root身份执行
+sudo -s
 curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/repo
 chmod a+x /usr/local/bin/repo
+exit
 
 # 这条普通身份也可以
 pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests

之所以前两条命令需要以 root 身份而不能是 sudo,是因为/usr/local/bin是一个只有 root 用户才有写权限的目录,而 sudo 命令虽然是以 root 身份执行,但重定向时候 sudo 用的也是当前用户身份,权限不足,自然报错。(如果是管道,那么 sudo 也是只对当前命令有效,而不是对后续的整个管道有效。

-

系统源码编译

获取源码

通过 repo + https/ssh 下载:

-
# 通过http下载
+            
# 通过http下载,这里需要注意你需要的ohos的版本
 repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify
-# 或者也可以通过ssh下载
+# 如果需要的是特定分支,-b后边改成对应分支名
+# 如果是tag,-b后的参数比较复杂,要在网页上提前确定好需要的tag名字,
+# 如下载的是tag为OpenHarmony-v3.2-Release的版本,命令如下:
+# repo init -u https://gitee.com/openharmony/manifest -b refs/tags/OpenHarmony-v3.2-Release --no-repo-verify
+# 除使用https外,也可以通过ssh下载
 # repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify
+
 repo sync -c
 repo forall -c 'git lfs pull'

prebuilts 与编译

# 先在源码根目录下执行脚本,安装编译器及二进制工具
 bash build/prebuilts_download.sh
 # 再执行如下命令进行版本编译
-sudo ./build.sh --product-name rk3568 --ccache
+# 注意:默认编译的时候,目标cpu是32位,即使为64位cpu也无法使用64位功能 +sudo ./build.sh --product-name rk3568 --ccache +# 如果是64位cpu,需要加上--target-cpu=arm64 +sudo ./build.sh --product-name rk3568 --ccache --target-cpu=arm64

编译完成

-

编译所生成的文件都归档在 out 目录下,结果镜像输出在源码根目录下的 out/rk3568/packages/phone/images 目录下。

+

编译所生成的文件都归档在 out 目录下,结果镜像输出在源码根目录下的out/rk3568/packages/phone/images目录下。

自此源码编译成功,即可进行镜像烧录。

编译报错解决记录

以下记录编译过程中出现的一些出现过的报错、坑点和注意事项,以为后来者鉴。

@@ -186,8 +188,7 @@ sudo mount -o remount -rw /var/snap/firefox/common/host-hunspell
./build.sh --product-name rk3568 --ccache

该命令是指导书中写的编译命令,但执行时候会出错;与上文所述的经确认无误的编译命令不同在于没加sudo

如果按照指导书的命令来,不出意外编译将会报错: - -

+

以下是该问题的具体描述:

build.log如下:

Set cache size limit to 100.0 GB
@@ -294,7 +295,23 @@ targets := vmlinux
linux 文件,可能文件体积过大而尚未创建完成,所有页面一直驻留在内存中,导致内存崩溃。

总而言之,言而总之,在VMware->虚拟机->设置->硬件->内存中,把内存扩大,就可以完美解决该问题。经我的测试,内存 13.2G(主机总内存 16G 时候推荐的最大虚拟机内存)是能编译完成的,编译时长 6h。最终解决。

-

完结撒花 ❀

+

ohos 的 NDK

+

NDK 编译方式比较简单,在源码根目录下执行如下命令:

+
# 安装依赖
+./build/build_scripts/env_setup.sh
+
+# 执行完上述命令后记得执行source ~/.bashrc或者重启终端
+source ~/.bashrc
+
+# 安装编译SDK需要的依赖包(编译镜像的时候是不依赖这些包的)
+sudo apt-get install libxcursor-dev libxrandr-dev libxinerama-dev
+
+./build.sh --product-name ohos-sdk --ccache --build-target ohos_ndk
+

编译出来的 NDK 在out/sdk/packages/ohos-sdk/linux/native下。当然同时也有 windows 版本的 NDK,你猜在哪里?

+

将编译出来的 NDK 的 zip 解压到你想要的目录下,然后将该目录添加到环境变量中,即可使用。

+

注意,NDK 包提供的交叉编译工具是 cmake 和 ninja,编译器是 clang 和 clang++,并没有我们熟悉的 gcc/g++和 make。除此之外,NDK + 还未我们提供编译所需的全套服务,如编译工具链配置文件ohos.toolchain.cmake、头文件、库文件等。快说,谢谢 ohos~

+

完结撒花

本次鸿蒙开发环境的搭建过程可谓一波三折,总结几个最大的坑点,或许可以作为编译的经验罢:

  • 有报错,试试添加权限!
  • @@ -306,7 +323,7 @@ targets := vmlinux

不说了,抓紧攒点钱开学升级电脑配置要紧……磁盘快炸了……

-

2024.2.12
甲辰年正月初三

+

2024.2.12,甲辰年正月初三
2024.4.24改

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 @@ - 源码大小就 36G 左右了 - 大量的依赖会占据数十 G 的空间 - 我用的是 160G 磁盘,编译成功,但基本不剩什么空间了 +- 注意所需要的**ohos 的版本、cpu 版本、位数等信息** 这里我用的是 VMWare+Ubuntu22.04 虚拟机。 @@ -31,15 +32,6 @@ ```bash #!/bin/bash - -########################################################################## -# File Name : harmony.sh -# Encoding : utf-8 -# Author : We-unite -# Email : weunite1848@gmail.com -# Created Time : 2024-02-07 12:32:50 -########################################################################## - set -e # 一旦出错立刻停止执行,不会执行后续指令 # 更新软件源 @@ -107,14 +99,18 @@ ssh-keygen -t rsa -C "your-email-address" 此时,我们就可以通过 ssh 的方式与 gitee 进行交互、也可以免密提交代码了。 -# 配置 repo 工具 +# 系统源码编译 + +## 配置 repo 工具 **注意:前两条命令需要以 root 身份执行!!!** ```bash # 以下两条命令需要以root身份执行 +sudo -s curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/repo chmod a+x /usr/local/bin/repo +exit # 这条普通身份也可以 pip3 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 之所以前两条命令需要以 root 身份而不能是 sudo,是因为`/usr/local/bin`是一个只有 root 用户才有写权限的目录,而 sudo 命令虽然是以 root 身份执行,但**重定向时候 sudo 用的也是当前用户身份**,权限不足,自然报错。(**如果是管道,那么 sudo 也是只对当前命令有效,而不是对后续的整个管道有效。**) -# 系统源码编译 - ## 获取源码 通过 repo + https/ssh 下载: ```bash -# 通过http下载 +# 通过http下载,这里需要注意你需要的ohos的版本 repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify -# 或者也可以通过ssh下载 +# 如果需要的是特定分支,-b后边改成对应分支名 +# 如果是tag,-b后的参数比较复杂,要在网页上提前确定好需要的tag名字, +# 如下载的是tag为OpenHarmony-v3.2-Release的版本,命令如下: +# repo init -u https://gitee.com/openharmony/manifest -b refs/tags/OpenHarmony-v3.2-Release --no-repo-verify +# 除使用https外,也可以通过ssh下载 # repo init -u git@gitee.com:openharmony/manifest.git -b master --no-repo-verify + repo sync -c repo forall -c 'git lfs pull' ``` @@ -143,12 +142,15 @@ repo forall -c 'git lfs pull' # 先在源码根目录下执行脚本,安装编译器及二进制工具 bash build/prebuilts_download.sh # 再执行如下命令进行版本编译 +# 注意:默认编译的时候,目标cpu是32位,即使为64位cpu也无法使用64位功能 sudo ./build.sh --product-name rk3568 --ccache +# 如果是64位cpu,需要加上--target-cpu=arm64 +sudo ./build.sh --product-name rk3568 --ccache --target-cpu=arm64 ``` ## 编译完成 -编译所生成的文件都归档在 out 目录下,结果镜像输出在源码根目录下的 out/rk3568/packages/phone/images 目录下。 +编译所生成的文件都归档在 out 目录下,结果镜像输出在源码根目录下的`out/rk3568/packages/phone/images`目录下。 自此源码编译成功,即可进行镜像烧录。 @@ -336,7 +338,77 @@ targets := vmlinux 总而言之,言而总之,在`VMware->虚拟机->设置->硬件->内存`中,把内存扩大,就可以完美解决该问题。经我的测试,内存 13.2G(主机总内存 16G 时候推荐的最大虚拟机内存)是能编译完成的,编译时长 6h。最终解决。 -# 完结撒花 ❀ +# ohos 的 NDK + +NDK 编译方式比较简单,在源码根目录下执行如下命令: + +```bash +# 安装依赖 +./build/build_scripts/env_setup.sh + +# 执行完上述命令后记得执行source ~/.bashrc或者重启终端 +source ~/.bashrc + +# 安装编译SDK需要的依赖包(编译镜像的时候是不依赖这些包的) +sudo apt-get install libxcursor-dev libxrandr-dev libxinerama-dev + +./build.sh --product-name ohos-sdk --ccache --build-target ohos_ndk +``` + +编译出来的 NDK 在`out/sdk/packages/ohos-sdk/linux/native`下。当然同时也有 windows 版本的 NDK,你猜在哪里? + +将编译出来的 NDK 的 zip 解压到你想要的目录下,然后将该目录添加到环境变量中,即可使用。 + +注意,NDK 包提供的交叉编译工具是 cmake 和 ninja,编译器是 clang 和 clang++,并没有我们熟悉的 gcc/g++和 make。除此之外,NDK 还未我们提供编译所需的全套服务,如编译工具链配置文件`ohos.toolchain.cmake`、头文件、库文件等。快说,谢谢 ohos~ + +为了更方便地使用NDK,鄙人不才,写了两个脚本,分别用于cmake编译和单文件编译: + +```bash +#!/bin/bash + +########################################################################## +# File Name : compile.sh +# Encoding : utf-8 +# Author : We-unite +# Email : weunite1848@gmail.com +# Created Time : 2024-02-29 15:19:15 +########################################################################## + +set -e + +if [ $UID -eq 0 ]; then + echo "Please do not run this script as root" + exit 1 +fi + +if [ $# -ne 2 ]; then + echo "Usage: $0 " + exit 1 +fi + +if [ $2 == "v8" ]; then + arch=arm64-v8a +elif [ $2 == "v7" ]; then + arch=armeabi-v7a +else + echo "Invalid architecture: $2" + exit 1 +fi + +link=$1 # static or shared +native_path=~/app/native + +export PATH=$native_path/build-tools/cmake/bin:$PATH + +# 使用cmake编译,编译生成的文件运行在rk3568上 +cmake -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) +cmake --build build +``` + +```bash +``` + +# 完结撒花 本次鸿蒙开发环境的搭建过程可谓一波三折,总结几个最大的坑点,或许可以作为编译的经验罢: @@ -345,4 +417,4 @@ targets := vmlinux - 内存 10G+ - 磁盘 160G+ -不说了,抓紧攒点钱开学升级电脑配置要紧……磁盘快炸了…… +不说了,抓紧攒点钱开学升级电脑配置要紧……磁盘快炸了…… \ 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 @@ #include #include #include -void html2js(char file_name[]) -{ +void html2js(char file_name[]) { FILE *html, *js; char buf[1024]; size_t i, len; @@ -11,27 +10,22 @@ void html2js(char file_name[]) strcpy(tmp, file_name); html = fopen(strcat(tmp, ".html"), "r"); js = fopen(strcat(file_name, ".js"), "w"); - if (html == NULL || js == NULL) - { + if (html == NULL || js == NULL) { printf("ERROR:Fail to open file!\n"); exit(1); } - while (!feof(html)) - { + while (!feof(html)) { memset(buf, '\0', 1024); fgets(buf, 1024, html); len = strlen(buf); fprintf(js, "document.writeln(\""); - for (i = 0; i < len - 1; i++) - { - if (buf[i] == '\"' || buf[i] == '\'') - { + for (i = 0; i < len - 1; i++) { + if (buf[i] == '\"' || buf[i] == '\'') { fprintf(js, "\\"); } fprintf(js, "%c", buf[i]); } - if (buf[i] != '\n') - { + if (buf[i] != '\n') { fprintf(js, "%c", buf[i]); } fprintf(js, "\");\n"); @@ -40,12 +34,11 @@ void html2js(char file_name[]) fclose(js); printf("Success!\n"); } -int main() -{ +int main() { char file_name[30]; - strcpy(file_name, "script4code"); + strcpy(file_name, "common/script4code"); html2js(file_name); - strcpy(file_name, "script4works"); + strcpy(file_name, "common/script4works"); html2js(file_name); return 0; } 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 @@ 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" fill="" p-id="3318"> - + @@ -117,7 +117,7 @@ 同时,每一代的子代应放在统一的div内,不得分别存放。 div内不同个体均以a标签包裹,如还有子代则点击时不可跳转,要求不写href属性 每个有祖先的div都需要写style="display:none",否则会出现bug - 有子代的,子代的dic紧随其后,不得乱放 --> + 有子代的,子代的div紧随其后,不得乱放 --> @@ -149,15 +149,21 @@ -一些小玩意儿 - -功能网页 -