欢迎加入 **开源鸿蒙跨平台开发者社区**,与大家一起共建鸿蒙化 C/C++ 三方库生态。

1. 前言

本教程面向 C/C++ 开发者,带你完成 nanomsg 三方库的鸿蒙平台适配,并能够在鸿蒙PC上进行验证。

通过本教程,你将掌握:

  • 使用 lycium 框架进行交叉编译配置
  • 处理 cmake 库的特殊构建需求
  • 解决交叉编译中的常见问题
  • 生成 HNP 格式分发包

前置准备

2. 前置准备

2.1 环境验证

打开宿主机终端窗口,输入以下命令验证环境。

# 验证环境变量
echo $OHOS_SDK
echo $HNP_TOOL

# 验证工具链
ls $OHOS_SDK/native/llvm/bin/aarch64-linux-ohos-clang

image-20260322152032525

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

image-20260322161427146

步骤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

image-20260322161516958

步骤9:验证 HNP 包

# 检查 HNP 包
cd /home/lycium_plusplus/lycium/output
tree

image-20260322161836364

4. 成果验证

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

image-20260323105905629

5. 进阶拓展

5.1 启用 TLS 支持(如需要)

nanomsg 支持 TLS 加密通信,但需要 NSS 库支持。如需启用:

# 在 cmake 配置中添加
-DNANOMSG_ENABLE_TLS=ON
# 并确保 NSS 库已适配

5.2 相关资源

6. 总结与注意事项

核心要点

  1. git clone:GitHub 下载不稳定时使用 git clone
  2. 分支名:nanomsg 分支名不带 v 前缀
  3. cmake 配置:显式设置工具链环境变量
  4. 禁用特性:TLS/DOC/TESTS 可根据需求禁用
  5. HNP 打包:使用 archive 函数自动生成
Logo

赋能鸿蒙PC开发者,共建全场景原生生态,共享一次开发多端部署创新价值。

更多推荐