【鸿蒙PC命令行移植适配】nanomsg 三方库鸿蒙化适配后在鸿蒙PC运行的完整实践
·
欢迎加入 **开源鸿蒙跨平台开发者社区**,与大家一起共建鸿蒙化 C/C++ 三方库生态。
1. 前言
本教程面向 C/C++ 开发者,带你完成 nanomsg 三方库的鸿蒙平台适配,并能够在鸿蒙PC上进行验证。
通过本教程,你将掌握:
- 使用 lycium 框架进行交叉编译配置
- 处理 cmake 库的特殊构建需求
- 解决交叉编译中的常见问题
- 生成 HNP 格式分发包
前置准备:
- 环境:【在 Ubuntu 中搭建鸿蒙 PC 三方库交叉编译构建开发环境】
- 基础:熟悉 C/C++ 交叉编译概念、shell 脚本基础
- 目标平台:鸿蒙PC
- 源代码仓库地址:https://github.com/nanomsg/nanomsg
- 适配完成仓库地址:https://atomgit.com/unisources/nanomsg
2. 前置准备
2.1 环境验证
打开宿主机终端窗口,输入以下命令验证环境。
# 验证环境变量
echo $OHOS_SDK
echo $HNP_TOOL
# 验证工具链
ls $OHOS_SDK/native/llvm/bin/aarch64-linux-ohos-clang

2.2 源码信息
pkgname=nanomsg
pkgver=1.2.2
source=https://github.com/nanomsg/nanomsg.git
buildtools=cmake
license=MIT
3. 实战步骤
步骤1:创建目录结构
操作目的:为 nanomsg 建立标准的适配仓结构
cd /home/lycium_plusplus/thirdparty
mkdir -p nanomsg
cd nanomsg
避坑点:目录名必须与
pkgname一致
步骤2:编写 HPKBUILD 配置文件
操作目的:定义交叉编译的完整构建流程
创建 nanomsg/HPKBUILD:
cd /home/lycium_plusplus/thirdparty/nanomsg
mkdir HPKBUILD
# Copyright (c) 2026 unisources
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Contributor: allincoding <3384684593@qq.com>
# Maintainer: allincoding <3384684593@qq.com>
pkgname=nanomsg
pkgver=1.2.2
pkgrel=0
pkgdesc="nanomsg is a light-weight messaging library"
url="https://nanomsg.org/"
archs=("armeabi-v7a" "arm64-v8a")
license=("MIT")
depends=()
makedepends=()
source="https://github.com/nanomsg/nanomsg.git"
downloadpackage=false
autounpack=false
buildtools="cmake"
builddir=$pkgname-$pkgver
packagename=
cloneFlag=true
prepare() {
if $cloneFlag; then
git clone -b ${pkgver} $source $builddir > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "$pkgname git clone $source error."
return -1
fi
cloneFlag=false
fi
mkdir -p $builddir/$ARCH-build
}
build() {
cd $builddir
# 设置交叉编译工具链
if [ $ARCH == "armeabi-v7a" ]; then
export CC=${OHOS_SDK}/native/llvm/bin/arm-linux-ohos-clang
export CXX=${OHOS_SDK}/native/llvm/bin/arm-linux-ohos-clang++
export AR=${OHOS_SDK}/native/llvm/bin/llvm-ar
export RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlib
export CFLAGS="-DOHOS_NDK -fPIC -march=armv7a -D__MUSL__=1"
export CXXFLAGS="-DOHOS_NDK -fPIC -march=armv7a -D__MUSL__=1"
export LDFLAGS=""
fi
if [ $ARCH == "arm64-v8a" ]; then
export CC=${OHOS_SDK}/native/llvm/bin/aarch64-linux-ohos-clang
export CXX=${OHOS_SDK}/native/llvm/bin/aarch64-linux-ohos-clang++
export AR=${OHOS_SDK}/native/llvm/bin/llvm-ar
export RANLIB=${OHOS_SDK}/native/llvm/bin/llvm-ranlib
export CFLAGS="-DOHOS_NDK -fPIC -D__MUSL__=1 -D__OHOS__"
export CXXFLAGS="${CFLAGS}"
export LDFLAGS="--target=aarch64-linux-ohos --sysroot=${SYSROOT}"
fi
export PATH=${OHOS_SDK}/native/llvm/bin:$PATH
PKG_CONFIG_LIBDIR="${pkgconfigpath}" \
${OHOS_SDK}/native/build-tools/cmake/bin/cmake "$@" \
-DOHOS_ARCH=$ARCH \
-DCMAKE_BUILD_TYPE=Release \
-DNANOMSG_ENABLE_TLS=OFF \
-DNANOMSG_ENABLE_DOC=OFF \
-DNANOMSG_ENABLE_TESTS=OFF \
-B$ARCH-build -S./ > $buildlog 2>&1
ret=$?
[ $ret -ne 0 ] && cd $OLDPWD && return $ret
$MAKE VERBOSE=1 -C $ARCH-build >> $buildlog 2>&1
ret=$?
cd $OLDPWD
return $ret
}
package() {
cd $builddir
$MAKE -C $ARCH-build install >> $buildlog 2>&1
cd $OLDPWD
}
archive() {
mkdir -p ${LYCIUM_ROOT}/output/$ARCH
pushd $LYCIUM_ROOT/usr/$pkgname/$ARCH
tar -zvcf ${LYCIUM_ROOT}/output/$ARCH/${pkgname}_${pkgver}.tar.gz *
popd
cp hnp.json $LYCIUM_ROOT/usr/$pkgname/$ARCH
${OHOS_SDK}/toolchains/hnpcli pack -i ${LYCIUM_ROOT}/usr/$pkgname/$ARCH -o ${LYCIUM_ROOT}/output/$ARCH/
}
check() {
echo "The test must be on an OpenHarmony device!"
}
cleanbuild() {
rm -rf ${PWD}/$builddir
}
步骤3:编写 HPKCHECK 测试用例配置文件
操作目的:定义测试用例执行入口
创建 nanomsg/HPKCHECK:
cd /home/lycium_plusplus/thirdparty/nanomsg
mkdir HPKCHECK
source HPKBUILD > /dev/null 2>&1 # 导入HPKBUILD文件
logfile=${LYCIUM_THIRDPARTY_ROOT}/${pkgname}/${pkgname}_${ARCH}_${OHOS_SDK_VER}_test.log
# 测试前的准备, 如果不需要可以不写。
checkprepare(){
return 0
}
# 在OH环境执行测试的接口
openharmonycheck() {
res=0 # 记录返回值
cd ${builddir}/${ARCH}-build # 进入到测试目录
ctest > ${logfile} 2>&1 # 执行测试命令
res=$?
cd $OLDPWD # 返回上一次目录
return $res # 返回测试值
}
步骤4:创建 hnp.json
操作目的:定义 HNP 打包元数据
创建 nanomsg/hnp.json:
cd /home/lycium_plusplus/thirdparty/nanomsg
mkdir hnp.json
{
"type": "hnp-config",
"name": "nanomsg",
"version": "1.2.2",
"install": {}
}
步骤5:创建 README 文档和开源说明文档
创建 nanomsg/README_zh.md:
cd /home/lycium_plusplus/thirdparty/nanomsg
mkdir README_zh.md
# nanomsg三方库说明
## 功能简介
nanomsg 是一个轻量级的高性能消息通信库,提供了多种通信模式(pair、reqrep、pubsub、pipeline、survey、bus),用于构建分布式系统。
## 三方库版本
- 1.2.2
创建 nanomsg/README.OpenSource:
cd /home/lycium_plusplus/thirdparty/nanomsg
mkdir README.OpenSource
{
"Name": "nanomsg",
"License": "MIT",
"License File": "LICENSE",
"Version Number": "1.2.2",
"Owner": "allincoding",
"Upstream URL": "https://github.com/nanomsg/nanomsg",
"Description": "nanomsg is a light-weight messaging library"
}
步骤6:执行编译构建
操作目的:验证 HPKBUILD 配置正确性
cd /home/lycium_plusplus/lycium
./build.sh nanomsg

步骤7:排查编译错误
问题1:CMake 找不到交叉编译工具
解决:显式设置 CC、CXX、AR 等环境变量
export CC=${OHOS_SDK}/native/llvm/bin/aarch64-linux-ohos-clang
export CXX=${OHOS_SDK}/native/llvm/bin/aarch64-linux-ohos-clang++
export PATH=${OHOS_SDK}/native/llvm/bin:$PATH
步骤8:验证构建产物
操作目的:确认编译成功
# 检查安装目录
cd /home/lycium_plusplus/lycium/usr/nanomsg
tree

步骤9:验证 HNP 包
# 检查 HNP 包
cd /home/lycium_plusplus/lycium/output
tree

4. 成果验证
参考开源鸿蒙PC构建终端工具Termony增加外部HNP包合入base.hnp的设计与实现实战教程将nanomsg.hnp集成到Termony开源项目中,在鸿蒙PC上运行Termony程序。在打开的Termony终端窗口输入nanocat -h命令,查看是否能够打印以下帮助信息,可以打印表示适配成功。

5. 进阶拓展
5.1 启用 TLS 支持(如需要)
nanomsg 支持 TLS 加密通信,但需要 NSS 库支持。如需启用:
# 在 cmake 配置中添加
-DNANOMSG_ENABLE_TLS=ON
# 并确保 NSS 库已适配
5.2 相关资源
6. 总结与注意事项
核心要点
- git clone:GitHub 下载不稳定时使用 git clone
- 分支名:nanomsg 分支名不带
v前缀 - cmake 配置:显式设置工具链环境变量
- 禁用特性:TLS/DOC/TESTS 可根据需求禁用
- HNP 打包:使用 archive 函数自动生成
更多推荐




所有评论(0)