回复
移植Node-RED低代码平台和Node.js到OpenHarmony标准系统(arm32) 原创
离北况归
发布于 2024-9-19 11:20
浏览
0收藏
笔者今年移植了Node.js到OpenHarmony标准系统上,现将成果开源到社区。
开源地址:
- gitee仓库:OpenHarmony标准系统上Node.js和Node-RED的使用
- atomgit仓库:OpenHarmony标准系统上Node.js和Node-RED的使用
编译环境
本文档基于 OpenHarmony SDK 4.0.10.1
需要注意的问题,此OpenHarmony SDK版本编译的二进制文件,需要此版本SDK提供的libc++_shared.so,否则会出现如下报错
Error relocating /data/node-v16.20-ohos-install/bin/node: __emutls_get_address: symbol not found
1.下载 nodejs
wget https://codeload.github.com/nodejs/node/tar.gz/refs/tags/v16.20.2
mv v16.20.2 v16.20.2.tar.gz
tar xvf v16.20.2.tar.gz
cd node-16.20.2
2.按照下面修改源码,解决编译报错问题
1.先打ohos_1.patch补丁,解决编译报错execvp: printf: Argument list too long
# 将ohos_1.patch放进node-16.20.2文件夹
cd node-16.20.2
patch -p1 </your_path/node-16.20.2/ohos_1.patch
2.最后打ohos_2.patch补丁。
# 将ohos_2.patch放进node-16.20.2文件夹
cd node-16.20.2
patch -p1 </your_path/node-16.20.2/ohos_2.patch
3.配置交叉编译环境,并编译 nodejs arm32 版本
export HOST_OS="linux"
export HOST_ARCH="ia32"
export CXX_host="g++ -m32"
export CC_host="gcc -m32"
export AR_host="ar"
export RANLIB_host="ranlib"
export LINK_host="${CXX_host}"
export OHOS_SDK=/home/jiajiahao/OpenHarmony/oh_third_party/ndk/ohos-sdk/linux
export AS=${OHOS_SDK}/native/llvm/bin/llvm-as
export CC="${OHOS_SDK}/native/llvm/bin/clang --target=arm-linux-ohos -march=armv7a"
export CXX="${OHOS_SDK}/native/llvm/bin/clang++ --target=arm-linux-ohos -march=armv7a"
export LD="${OHOS_SDK}/native/llvm/bin/lld --target=arm-linux-ohos -march=armv7a"
export STRIP=${OHOS_SDK}/native/llvm/bin/llvm-strip
export RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlib
export OBJDUMP=${OHOS_SDK}/native/llvm/bin/llvm-objdump
export OBJCOPY=${OHOS_SDK}/native/llvm/bin/llvm-objcopy
export NM=${OHOS_SDK}/native/llvm/bin/llvm-nm
export AR=${OHOS_SDK}/native/llvm/bin/llvm-ar
export CFLAGS="-fPIC -march=armv7a -D__MUSL__=1 -Wno-c99-extensions -Wno-strict-prototypes -Wno-deprecated-non-prototype -Wno-unqualified-std-cast-call -Wno-long-long"
export CXXFLAGS="-fPIC -march=armv7a -D__MUSL__=1 -Wno-c99-extensions -Wno-strict-prototypes -Wno-deprecated-non-prototype -Wno-unqualified-std-cast-call -Wno-long-long"
export GYP_DEFINES="target_arch=arm host_arch=ia32 host_os=linux"
4.安装必要的库
sudo apt-get install gcc-multilib g++-multilib
5.编译得到二进制包
./configure --dest-cpu="arm" --dest-os=linux --openssl-no-asm --without-intl --cross-compiling --prefix=/home/jiajiahao/OpenHarmony/oh_third_party/node.js_port_oh/node.js_port_oh_16.20/node-v16.20-ohos-install
make -j 20 > ohos.log
make install
tar czvf node-v16.20-ohos-install.tar.gz node-v16.20-ohos-install
6.nodejs 部署到开发板
# 推送OpenHarmony NDK里/llvm/lib/arm-linux-ohos/c++/libc++_shared.so到开发板
hdc file send libc++_shared.so /data
# 推送node-v16.20-ohos-install.tar.gz到开发板
hdc file send node-v16.20-ohos-install.tar.gz /data
# 需要将系统改为可读写,因为部署nodejs需要文件操作
mount -o remount,rw /
cd data
tar xvf node-v16.20-ohos-install.tar.gz
cd ..
// 拷贝安装动态库到开发板lib目录
cp /data/libc++_shared.so /lib
# nodejs中默认的env路径是/usr/bin/env,默认的sh路径是/bin/sh,OpenHarmony中这两者的路径是/bin/env和/bin/sh
# 手动创建/usr/bin目录
mount -o remount,rw /
mkdir /usr
# 这会创建一个符号链接,将/usr/bin链接到/bin目录。这意味着当你在/usr/bin下执行某个程序时,实际上是在bin目录中查找并执行该程序,因为/usr/bin实际上是/bin的别名。
ln -s /bin /usr/bin
# share 文件夹通常包含与 Node.js 相关的共享数据、文档、示例等内容。
cp /data/node-v16.20-ohos-install/share /usr/ -rf
# 使得node和npm在shell全局可以使用
cp /data/node-v16.20-ohos-install/bin/* /bin/ -rf
cp /data/node-v16.20-ohos-install/lib/* /lib/ -rf
7.nodered 部署到开发板
# 重新加载系统为可读写
mount -o remount,rw /
# 使用npm官方源
npm config set registry https://registry.npmjs.org/
# 下载node-red
npm install -g --unsafe-perm node-red
nohup node-red & # 启动node-red,关闭终端不关闭node-red服务
需要的设备:OpenHarmony开发板、windows电脑
1.将开发板和电脑连接同一网络
开发板执行
# 查看开发板ip地址
ifconfig
mount -o remount,rw /
node-red
2.电脑端输入http:开发板ip地址:1880
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
已于2024-9-19 11:20:24修改
赞
收藏
回复
相关推荐