三方库 nanomsg

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

导读 :本文说明如何在 lycium++ 中完成 thirdparty/nanomsg/ 交叉编译,得到 lycium/output/<ARCH>/libnanomsg.soHNP/tar


一、背景与本文目标

说明
应用场景 在鸿蒙应用或原生服务中使用 可扩展消息协议(req/rep、pub/sub、pipeline 等)做进程间或网络通信。
读者将学会 cmake "$@" 正确注入工具链;-DNN_*=OFF 收敛交叉构建。
非本文范围 上游协议栈深度定制。

二、环境与约束

项目 说明
环境配置参考 仓库内 lycium/doc/ohos_use_sdk/OHOS_SDK-Usage.mdlycium/README.md;社区可参考 《在 Ubuntu 中搭建鸿蒙 PC 三方库交叉编译构建开发环境》
OHOS SDK 版本 / API Level 以本地已安装 SDK 为准(示例:6.0 Release,Clang 15.x);需 export OHOS_SDK=<SDK 根目录>
lycium++(本仓库)地址 https://gitcode.com/OpenHarmonyPCDeveloper/lycium_plusplus.git(或实际 fork / 分支)
目标库上游源码地址 nanomsg/nanomsg,标签 1.2.2
本仓库适配目录 thirdparty/nanomsg/
适配目标平台 鸿蒙 PC

三、目标库说明与移植路径总览

3.1 目标库说明

  • 概述nanomsg 是实现多种 可扩展消息协议 (req/rep、pub/sub、survey、pipeline、bus 等)的 C 库 ,支持 TCP、IPC、WebSocket 等传输。许可证为 MIT (见上游 COPYING)。
  • 本仓库版本pkgver=1.2.2,解压顶层目录 nanomsg-1.2.2
  • 依赖关系
    • 系统/其它 HPK 依赖 :无,depends=()
    • 宿主构建工具 :无额外 makedepends;CMake 由 OHOS SDK 提供;pthread 由工具链与 find_package(Threads) 解决。
  • 构建系统判断CMake 。根目录 CMakeLists.txtproject(nanomsg C),并提供 NN_TESTS / NN_TOOLS / NN_ENABLE_DOC 等选项。

上游工程入口(节选,说明交叉编译时通过 -D 关闭测试与工具):

cmake 复制代码
cmake_minimum_required (VERSION 2.8.12...3.5)
project (nanomsg C)
option (NN_TESTS "Build and run nanomsg tests" ON)
option (NN_TOOLS "Build nanomsg tools" ON)
# ...
add_subdirectory (src)

3.2 移植路径总览

阶段 内容
1 创建 thirdparty/nanomsg/
2 HPKBUILD(含 archive()),无 patch
3 HPKCHECK
4 hnp.json
5 README_zh.mdREADME.OpenSourcedocs/hap_integrate.md
6 cd lycium && ./build.sh nanomsg 直至通过

四、详细适配过程

以下与仓库 thirdparty/nanomsg/HPKBUILD 保持一致(若你本地有微调,以仓库为准)。

4.1 分析与选型
结论
编译方式 CMakebuildtools=cmake
是否需 patch ;通过 CMake -DNN_*=OFF 收敛功能
downloadpackage / autounpack 均为 truesource 使用 codeload URL,与 github.com/.../archive/... 内容等价,部分网络更稳定

4.2 HPKBUILD 元数据与下载字段
bash 复制代码
pkgname=nanomsg
pkgver=1.2.2
pkgrel=0
pkgdesc="High-performance scalability protocols C library (nanomsg)"
url="https://github.com/nanomsg/nanomsg"
archs=("armeabi-v7a" "arm64-v8a" "x86_64")
license=("MIT")
depends=()
makedepends=()

# 与 GitHub archive 等价,部分网络环境下 codeload 更稳定
source="https://codeload.github.com/nanomsg/nanomsg/tar.gz/refs/tags/${pkgver}"
builddir=nanomsg-${pkgver}
packagename=nanomsg-${pkgver}.tar.gz
downloadpackage=true
autounpack=true
buildtools=cmake

source ./envset.sh

4.3 prepare / build / package(核心逻辑)

prepare:每架构一份源码树,避免多架构构建互相污染。

bash 复制代码
prepare() {
    cp -rf "${builddir}" "${builddir}-${ARCH}-build"
}

build必须 使用 cmake "$@" ,由 lycium/script/build_hpk.sh 注入工具链、安装前缀、-DOHOS_ARCH 等;禁止 再写 -DCMAKE_TOOLCHAIN_FILE="${OHOS_CMAKE_TOOLCHAIN_FILE}"**(该变量本身已是带 -D 的完整参数,重复嵌套会报错)。

关闭测试、文档、工具及 getaddrinfo_a,减小体积并降低 musl 下对 libanl 的依赖风险。

bash 复制代码
build() {
    cd "${builddir}-${ARCH}-build" || return 1

    if [ "$ARCH" = "armeabi-v7a" ]; then
        setarm32ENV
    elif [ "$ARCH" = "arm64-v8a" ]; then
        setarm64ENV
    elif [ "$ARCH" = "x86_64" ]; then
        setx86_64ENV
    fi

    PKG_CONFIG_LIBDIR="${pkgconfigpath}" \
        cmake "$@" \
        -B build \
        -S . \
        -DCMAKE_SYSTEM_NAME=Linux \
        -DNN_TESTS=OFF \
        -DNN_ENABLE_DOC=OFF \
        -DNN_TOOLS=OFF \
        -DNN_ENABLE_GETADDRINFO_A=OFF \
        >> "${buildlog}" 2>&1 || return 1

    ${MAKE} -C build >> "${buildlog}" 2>&1
    ret=$?
    cd "${OLDPWD}" || return 1
    return $ret
}

package

bash 复制代码
package() {
    ${MAKE} -C "${builddir}-${ARCH}-build/build" install >> "${buildlog}" 2>&1
}

check() (占位,真机测试在 HPKCHECK 扩展):

bash 复制代码
check() {
    echo "The test must be on an OpenHarmony device!"
}

cleanbuild / recoverpkgbuildenv

bash 复制代码
cleanbuild() {
    rm -rf "${PWD:?}/${builddir}" \
        "${PWD}/${builddir}-armeabi-v7a-build" \
        "${PWD}/${builddir}-arm64-v8a-build" \
        "${PWD}/${builddir}-x86_64-build"
}

recoverpkgbuildenv() {
    if [ "$ARCH" = "armeabi-v7a" ]; then
        unsetarm32ENV
    elif [ "$ARCH" = "arm64-v8a" ]; then
        unsetarm64ENV
    elif [ "$ARCH" = "x86_64" ]; then
        unsetx86_64ENV
    fi
}

4.4 补丁

本适配无需 patch。


4.5 hnp.jsonarchive()

hnp.json 全文name / versionHPKBUILD 一致):

json 复制代码
{
    "type": "hnp-config",
    "name": "nanomsg",
    "version": "1.2.2",
    "install": {}
}

archive()

bash 复制代码
archive() {
    export HNP_TOOL="${HNP_TOOL:-${OHOS_SDK}/toolchains/hnpcli}"
    mkdir -p "${LYCIUM_ROOT}/output/${ARCH}"
    pushd "${LYCIUM_ROOT}/usr/${pkgname}/${ARCH}" > /dev/null
    tar -zvcf "${LYCIUM_ROOT}/output/${ARCH}/${pkgname}_${pkgver}.tar.gz" .
    popd > /dev/null
    cp "${PWD}/hnp.json" "${LYCIUM_ROOT}/usr/${pkgname}/${ARCH}/"
    ${HNP_TOOL} pack -i "${LYCIUM_ROOT}/usr/${pkgname}/${ARCH}" -o "${LYCIUM_ROOT}/output/${ARCH}/"
}

4.6 构建命令与日志
bash 复制代码
export OHOS_SDK=/path/to/your/ohsdk/linux
cd lycium
./build.sh nanomsg
  • 成功标志 :出现 Build nanomsg 1.2.2 end!ALL JOBS DONE!!!;各架构 lycium/usr/nanomsg/<ARCH>/lib/libnanomsg.solycium/output/<ARCH>/nanomsg.hnp (及 nanomsg_1.2.2.tar.gz)。
  • 失败时 :查看包目录或 lycium/scriptnanomsg-1.2.2-<ARCH>-lycium_build.log (文件名以 pkgname-pkgver-$ARCH 为准)。示例(节选,仅作格式说明):
text 复制代码
-- The C compiler identification is Clang 15.0.4
-- Detected nanomsg ABI v...
...
[100%] Built target nanomsg

若配置失败,常见为未传 "$@" 或 toolchain 双重嵌套,日志中会出现:

text 复制代码
CMake Error ... Could not find toolchain file:
  -DCMAKE_TOOLCHAIN_FILE=/...

4.7 最终产物与目录树

安装前缀:$LYCIUM_ROOT/usr/nanomsg/$ARCH/ (本仓库中 LYCIUM_ROOTlycium/)。

验证示例arm64-v8a):

bash 复制代码
find lycium/usr/nanomsg/arm64-v8a -type f | head -20

典型输出结构(与本地构建一致):

text 复制代码
lycium/usr/nanomsg/arm64-v8a/include/nanomsg/nn.h
lycium/usr/nanomsg/arm64-v8a/include/nanomsg/tcp.h
lycium/usr/nanomsg/arm64-v8a/lib/libnanomsg.so
lycium/usr/nanomsg/arm64-v8a/lib/pkgconfig/nanomsg.pc
lycium/usr/nanomsg/arm64-v8a/lib/cmake/nanomsg-1.2.1/nanomsg-config.cmake
# ... 其余协议头文件、CMake 包文件等

说明:lib/cmake/ 下目录名可能出现 nanomsg-1.2.1 ,来自上游 .version 与包版本检测 ,与 tag 1.2.2 不完全一致,一般不影响链接 libnanomsg.so

file 检查交叉架构

bash 复制代码
file lycium/usr/nanomsg/arm64-v8a/lib/libnanomsg.so
... ELF 64-bit LSB shared object, ARM aarch64 ...
  • 主要库文件lib/libnanomsg.so
  • lycium/output/<ARCH>/nanomsg_1.2.2.tar.gznanomsg.hnp

五、鸿蒙 PC / 设备上的运行与验证

5.1 命令行工具类(静态/动态可执行文件)

不适用(默认配置)HPKBUILD-DNN_TOOLS=OFF ,交叉产物不包含 nanocat 等 CLI。若需工具,见 §七 FAQ


5.2 应用工程集成(库 / 非独立 CLI)

应用 CMakeLists.txt 片段 (将预编译目录拷贝到工程 thirdparty/prebuilt/nanomsg/${OHOS_ARCH} 后):

cmake 复制代码
set(NANOMSG_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/prebuilt/nanomsg/${OHOS_ARCH}")
target_include_directories(entry PRIVATE "${NANOMSG_ROOT}/include")
target_link_libraries(entry PRIVATE "${NANOMSG_ROOT}/lib/libnanomsg.so")

动态库部署到 HAP 时,请按 lycium/doc/app_calls_third_lib.mdsoname 对应.so 放入 entry/libs/${OHOS_ARCH}/

最小 C 冒烟示例 (创建 socket 后关闭;在设备或交叉环境编译时指定 -I.../include-L.../lib -lnanomsg):

c 复制代码
#include <stdio.h>
#include <nanomsg/nn.h>

int main(void)
{
    int s = nn_socket(AF_SP, NN_PAIR);
    if (s < 0) {
        fprintf(stderr, "nn_socket: %s\n", nn_strerror(nn_errno()));
        return 1;
    }
    nn_close(s);
    return 0;
}

5.3 交叉编译阶段测试(构建树 / 宿主)
说明
上游单测 HPKBUILD-DNN_TESTS=OFF ,交叉构建不编译、不运行 nanomsg 自带测试二进制。
本地可选 若仅在宿主编原生 nanomsg,可 cmake -DNN_TESTS=ONctest(与 HPK 流程无关)。
bash 复制代码
# 交叉 HPK 下通常不执行
# ctest --output-on-failure --test-dir build
(以 ALL JOBS DONE 与 libnanomsg.so 为准。)

5.4 仓库 HPKCHECKopenharmonycheck
bash 复制代码
source HPKBUILD > /dev/null 2>&1

openharmonycheck() {
    echo "The test must be on an OpenHarmony device!"
    # 设备上可链接 libnanomsg 编写 req/rep 等冒烟用例
    return 0
}

5.5 设备 / 模拟器冒烟(推荐至少一条)

在应用或独立可执行文件中:

  1. nn_socket(AF_SP, NN_PAIR) (或 req/rep)创建 socket;
  2. nn_close(s) 释放;
  3. 期望 返回码非负 / 无崩溃。

部署 libnanomsg.so 时遵守 lycium/doc/app_calls_third_lib.md


5.6 应用内自动化(可选)

模块测试中对 pub/subipc 做一轮 send/recv 闭环,日志含 成功 关键字即可。


5.7 无测试时的写法(边界说明)

交叉阶段以 §4.7 file libnanomsg.so三架构安装树完整为主;协议一致性依赖上游测试集与真机网络/IPC 环境。


六、总结与后续工作

  • 小结cmake "$@" + 关闭 NN_TESTS/TOOLS ;产物以 libnanomsg.soHAP 集成 为主。
  • 后续 :可按需在交叉构建中开启 TOOLS 并补充 §5.1 命令行验证。

七、FAQ

  1. Could not find toolchain file: -DCMAKE_TOOLCHAIN_FILE=...
    • 现象
text 复制代码
CMake Error ... Could not find toolchain file:
  -DCMAKE_TOOLCHAIN_FILE=/home/.../ohos.toolchain.cmake
  • 原因 :把环境变量 OHOS_CMAKE_TOOLCHAIN_FILE (已是 -DCMAKE_TOOLCHAIN_FILE=路径 整段 )再次传给 -DCMAKE_TOOLCHAIN_FILE=
  • 解决build() 中只保留 cmake "$@" ,勿手写重复 toolchain 行(与 thirdparty/libini 技能说明一致)。
  1. 源码包 wget 超时或 GitHub archive 失败

    • 现象download.log 中长时间 Connecting to github.com ... timed out
    • 解决 :使用 HPKBUILD 中已配置的 codeload URL ,或将浏览器下载的 nanomsg-1.2.2.tar.gz 放到 thirdparty/nanomsg/ (与 packagename 同名),build_hpk 会跳过下载。
  2. 需要 nanocat 或单元测试

    • 解决 :在 cmake 行去掉 -DNN_TOOLS=OFF-DNN_TESTS=OFF,并评估构建时间与设备上跑测试的可行性。
  3. lib/cmake/nanomsg-1.2.1 与版本 1.2.2 不一致

    • 原因 :上游 NN_PACKAGE_VERSION.version 等读取,与 git tag 可能不同。
    • 解决 :以 libnanomsg.sonn.h 为准继续集成;若强依赖 CMake config 路径,可在文档中写明实际目录名。

八、附录与参考

相关推荐
没头脑的男大4 小时前
华为笔试题练习
华为
弓.长.5 小时前
ReactNative for OpenHarmony项目鸿蒙化三方库:react-native-pdf — PDF文档查看器
react native·pdf·harmonyos
开开心心就好7 小时前
绿色版PDF多功能工具,支持编辑转换
人工智能·windows·pdf·ocr·excel·语音识别·harmonyos
云和数据.ChenGuang8 小时前
鸿蒙餐饮系统:全场景智慧餐饮新范式
人工智能·机器学习·华为·数据挖掘·harmonyos·鸿蒙·鸿蒙系统
Swift社区8 小时前
AI 驱动 UI:鸿蒙 ArkUI 的新可能
人工智能·ui·harmonyos
KIHU快狐10 小时前
KIHU快狐|国产鸿蒙系统立式一体机RK3588芯片多点触控交互查询终端
华为·交互·harmonyos
●VON10 小时前
半小时从零开发鸿蒙记事本应用:AI辅助开发实战
人工智能·华为·harmonyos
KIHU快狐12 小时前
KIHU快狐|电容触摸壁挂一体机鸿蒙信发系统国产芯片显示终端
华为·harmonyos
弓.长.12 小时前
ReactNative for OpenHarmony项目鸿蒙化三方库:react-native-flip-card — 翻转卡片组件
react native·react.js·harmonyos