为 OpenHarmony 交叉编译环境添加 libsmb2 库

概述

libsmb2 是一个 SMB2/SMB3 协议的用户空间客户端库,由 Ronald Sahlberg 开发,允许应用程序在不依赖内核 SMB 客户端的情况下访问 SMB 共享。本文介绍如何将其纳入项目的 OpenHarmony 交叉编译体系。开发环境的配置在之前的文章提到过就不再赘述。

libsmb2 简介

  • 项目地址: https://github.com/sahlberg/libsmb2
  • 当前版本: 6.2
  • 许可证: LGPL-2.1
  • 构建系统: CMake
  • 依赖: 仅需标准 C 库,无第三方依赖
  • 支持架构: armeabi-v7a、arm64-v8a、x86_64

项目编译体系

本项目基于 HPKBUILD(仿 Arch Linux PKGBUILD)的编译体系。核心组件:

  • lycium/build.sh — 编译调度入口,自动发现 thirdparty/community/ 下的库
  • lycium/script/build_hpk.sh — 单库构建流程:下载 → 校验 → 解压 → prepare → build → package
  • lycium/script/envset.sh — 交叉编译工具链环境变量设置(arm32/arm64/x86_64)
  • HPKBUILD — 每个库的元数据和构建脚本定义文件

添加步骤

1. 创建库目录

mkdir -p community/libsmb2

2. 编写 HPKBUILD

community/libsmb2/HPKBUILD 中定义以下内容:

# Copyright (c) 2025 Huawei Device Co., Ltd.
# 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.

pkgname=libsmb2
pkgver=6.2
pkgrel=0
pkgdesc="SMB2/3 userspace client library"
url="https://github.com/sahlberg/libsmb2"
archs=("armeabi-v7a" "arm64-v8a" "x86_64")
license=("lgpl-2.1")
depends=()
makedepends=()

source="https://github.com/sahlberg/libsmb2/archive/refs/tags/libsmb2-${pkgver}.tar.gz"

downloadpackage=true
autounpack=true
buildtools="cmake"

# GitHub tarballs extract as repo-tag
builddir=$pkgname-libsmb2-${pkgver}
packagename=$builddir.tar.gz

source envset.sh

prepare() {
    mkdir -p $builddir/$ARCH-build
}

build() {
    cd $builddir
    PKG_CONFIG_LIBDIR="${pkgconfigpath}" ${OHOS_SDK}/native/build-tools/cmake/bin/cmake "$@" \
        -B$ARCH-build -S./ -L >> $buildlog 2>&1
    $MAKE VERBOSE=1 -C $ARCH-build >> $buildlog 2>&1
    ret=$?
    cd $OLDPWD
    return $ret
}

package() {
    cd $builddir
    $MAKE VERBOSE=1 -C $ARCH-build install >> $buildlog 2>&1
    cd $OLDPWD
}

check() {
    echo "The test must be on an OpenHarmony device!"
}

# 清理环境
cleanbuild(){
    rm -rf ${PWD}/$builddir #${PWD}/$packagename
}

字段说明

字段 说明
pkgname 库名称,用于路径和依赖引用
pkgver 版本号
pkgrel 包发布编号
archs 目标架构数组,可选 armeabi-v7aarm64-v8ax86_64
depends 运行时依赖(其他 HPKBUILD 的 pkgname)
makedepends 构建时主机工具依赖(如 cmakeautoconf
source 源码下载 URL
downloadpackage 是否自动下载源码
autounpack 是否自动解压源码包
buildtools 构建系统类型,cmakeconfigure
builddir 解压后的源码目录名
packagename 源码压缩包文件名

编译函数说明

函数 作用
prepare() 在每种架构编译前执行,通常创建构建目录、设置交叉编译工具链(调用 setarm32ENV/setarm64ENV/setx86_64ENV
build() 执行实际编译,使用 $buildargs(由 build_hpk.sh 根据 buildtools 自动配置)
package() 将编译产物安装到 $LYCIUM_ROOT/usr/$pkgname/$arch/
check() 可选测试,通常仅打印提示
cleanbuild() 清理编译产物

构建流程

  1. 环境变量: 编译前需设置 OHOS_SDK 环境变量,指向 OpenHarmony SDK 路径:
export OHOS_SDK=/path/to/ohos/sdk
  1. 编译单个库
cd lycium && bash build.sh ../community/libsmb2

编译产物

编译完成后,会在 lycium/usr/libsmb2/{arch}/ 目录下生成对应的库文件(如 liblibsmb2.so)。

arm64-v8a       armeabi-v7a     x86_64

注意事项

  1. 网络环境: GitHub 直连可能受限,可通过代理或镜像源下载源码
  2. CMake 工具链: build_hpk.sh 会自动传入 -DCMAKE_TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake 用于交叉编译
  3. 依赖顺序: 如果 libsmb2 依赖其他库(如 openssl),需在 depends 中声明,构建系统会自动处理编译顺序
  4. 安装路径: 编译产物默认安装到 lycium/usr/libsmb2/{arch}/ 目录下

参考文档

参考文档:libsmb2

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐