OpenHarmony C/C++三方库移植适配

简介

众所周知,C/C++三方库相对与JS/ETS的三方组件来说,其运行效率高。那如何将一个C/C++三方库移植到OH系统上呢?本文将介绍如何快速高效的移植一个C/C++三方库到OpenHarmony上。

C/C++三方库适配问题与解决方案

由上图可以看出,三方库移植的流程以及现状。

三方库运行时依赖分析

针对运行时依赖的分析,我们开发了对应的C/C++三方库风险识别工具,通过该工具可以扫描出三方库是否有对NDK,OpenGL等接口的依赖,以及是否有bionic的C库接口的依赖等。该工具可以让我们快速的对一个C/C++三方库进行风险识别。

工具的使用请参照C/C++三方库风险识别工具使用方法.

三方库编译构建

OpenHarmony的应用编译开发使用的是DevEco Studio,而该工具目前只支持cmake的编译,但开源的C/C++三方库编译方式多样化,包含cmake,configured等方式。对于原生库cmake无法在IDE上编译构建的,我们需要分析问题原因并需要针对IDE修改原生CMakeLists.txt。而非cmake编译方式的三方库,我们也需要分析该库的编译方式进行手写CMakeLists.txt文件将该库编译方式改为cmake编译构建。这些过程比较耗时,尤其对一些大型的C/C++三方库.

针对于这些问题,我们开发一套基于linux下用原生库的编译脚本进行交叉编译三方库的工具。该工具协助开发者,在 linux系统上快速编译构建能在OpenHamony上运行的c/c++ 三方库。

三方库测试验证

业界内C/C++三方库测试框架多种多样,我们无法将其统一,因此为了保证原生库功能完整,我们基于原生库的测试用例进行测试验证。为此,我们需要集成了一套可以在OH环境上进行make test等操作的环境,具体方法可参照:
CItools 介绍

三方库的使用

将编译好的三方库以及对应的头文件拷贝到应用工程对应的CPP目录,或将三方库拷贝到对应的工程/entry/libs/armxx/目录,头文件拷贝到工程/entry/include目录。目前建议使用第一种方式,即将三方库以及对应的头文件拷贝到CPP目录。

快速适配三方库实例

我们可以通过工具在 linux系统上快速编译构建能在OpenHamony上运行的c/c++ 三方库,该现在支持cmake以及config及make等构建方式,下面以minizip-ng三方库为例详细讲解lycium工具的使用。

使用约束

  • OpenHarmony SDK版本: Ohos_sdk_public 3.2.11.9
  • API版本: API Version 9 Release
  • DevEco Studio版本: 3.1.0.400

环境搭建

  • 工具下载:工具
  • 环境搭建参照 编译环境搭建
  • OpenHarmony SDK版本下载地址: Ohos_sdk_public 3.2.11.9 (API Version 9 Release)

编译脚本规则

工具编译脚本模板如下:

# Contributor: Your Name <youremail@domain.com>
# Maintainer: Your Name <youremail@domain.com>pkgname=NAME # 库名(必填)
pkgver=VERSION # 库版本(必填)
pkgrel=0 # 发布号,默认为0
pkgdesc="" # 库描述
url="" # 库的官网链接
archs=("armeabi-v7a" "arm64-v8a") # cpu 架构, 默认编译2种架构
license=()  # 库的开源协议
depends=() # 依赖库的目录名 必须保证被依赖的库的archs是当前库的archs的超集,有依赖时必须填写相应的依赖
makedepends=() # 构建库时的依赖工具
source="https://downloads.sourceforge.net/$pkgname/$pkgname-$pkgver.tar.gz" # 库源码下载链接(必填)downloadpackage=true # 是否自动下载压缩包,默认true;如果为 false 则需要用户在 prepare 函数中自行下载(如代码只能通过git clone下载(项目中依赖 submoudle)等特殊情况)
autounpack=true # 是否自动解压,默认 true, 如果为 false 则需要用户在 prepare 函数中自行解压
buildtools= # 编译方法, 暂时支持cmake, configure, make等, 根据原生库的编译构建方式填写.(必填)builddir= # 源码压缩包解压后目录名(必填)
packagename=$builddir.tar.gz # 压缩包名,保持该默认值# 编译前准备工作,如设置环境变量,创建编译目录等
prepare() {mkdir -p $builddir/$ARCH-build
}# 执行编译构建的命令
build() {
}# 安装打包
package() {cd $builddir/$ARCH-buildmake installcd $OLDPWD
}# 测试,需要在 ohos 设备上进行
check() {echo "The test must be on an OpenHarmony device!"
}# 清理环境
cleanbuild() {rm -rf ${PWD}/$builddir #${PWD}/$packagename
}

每个编译脚本都需要按照该规则定义相应的变量以及对应的5个函数,其中变量标明必填是每个库根据库信息必须填写正确,否则导致编译失败,其他变量无初始值的建议根据库信息也填写,方便后期维护。
函数说明:

  • prepare 函数

    编译前准备工作,主要包含:

    1. 创建编译目录(推荐根据不同架构创建不同编译目录,即使用模板默认方式即可)
    2. 设置环境变量(根据不同的编译构建方式进行设置)
    3. 下载源码(downloadpackage=false,推荐使用框架下载)
    4. 解压源码包(下载的是源码包且autounpack=fasle,推荐使用框架解压)
    5. 对于编译时需要做特殊修改(如编译时需要对编译脚本进行打patch操作等)
  • build 函数

    三方库的编译构建函数,makefile生成以及执行make指令。该函数需要根据原生库的构建方式进行配置,不同编译构建基本模板如下:

    1. cmake

      build() {cd $builddir  ## 进入到编译目录${OHOS_SDK}/native/build-tools/cmake/bin/cmake $* -DOHOS_ARCH=$ARCH -B$ARCH-build -S./ -L  ## 执行cmake,配置相应的变量并生成Makefile文件make -j4 -C $ARCH-build  ## 执行make指令,生成对应的库文件以及可执行用例ret=$?    ## 记录make执行的返回值cd $OLDPWD  ## 返回进入编译目录前的路径return $ret    ## 返回make的返回值
      }
      

      变量说明:

      1. 其中 OHOS_SDK是 ohos sdk的安装路径,在执行编译前需要设置。
      2. $*代表的参数:-DCMAKE_FIND_ROOT_PATH="..." -DCMAKE_TOOLCHAIN_FILE="..." -DCMAKE_INSTALL_PREFIX="..." 依赖库的搜索路径,toolchain file 路径,安装路径
      3. -DOHOS_ARCH 代表当前的编译架构
      4. -B 代表编译路径
      5. -S 代表源码路径
      6. 其他特殊设置需要根据库自身情况在cmake后面进行添加。
    2. configure

      build() {cd $builddir/$ARCH-build../configure $*>> `pwd`/build.log 2>&1   ## 执行configure,配置相应的变量并生成Makefile文件make -j4 >> `pwd`/build.log 2>&1ret=$?cd $OLDPWDreturn $ret
      }
      

      变量说明:

      1. $*代表的参数:库的安装路径
      2. 其他特殊设置需要根据库自身情况在configure后面进行添加。
    3. make

      make CC=${cc} AR=${ar} RANLIB=${ranlib} -j4 >> `pwd`/build.log 2>&1
      

      变量说明:

      1. 其中CC,AR,RANLIB等变量根据原生库Makefile文件中变量来设定,其值可在prepare函数中设定。
  • package 函数

    三方库安装打包函数,该函数只需在编译目录直接执行make install即可。对于不支持make install的三方库,需要在该函数中手动安装三方库文件以及头文件等(将对应文件通过cp命令拷贝到对应的安装路径下面)

  • check 函数

    该函数实现了测试准备以及测试说明。对于在目标机器上测试需要生成的测试用例或对于测试需要做修改的,可以在该接口中实现,并需要在该函数中说明在目标机器上运行测试的方法 。真正的测试需要在目标机器上进行。

  • cleanbuild 函数

    该函数主要清理当前库的编译环境。

编译脚本模板更多信息可以参照HPKBUILD。

minizip快速适配

通过对minizip-ng三方库的分析,我们可以知道,该库依赖了openssl,lzma,bzip2,libz,zstd以及googletest等诸多其他的三方库,我们可以选择需要依赖的三方库,关闭不依赖的三方库,此例中我们选择lzma,openssl以及bzip2为依赖进行说明,而这3个依赖库的编译方式分别是cmake,configure以及make。

  • 在thirdparty目录下创建minizip-ng三方库目录,以及对应的xz(该库编译完后会生成liblzma.a以及对应的liblzma.so),openssl和bzip2.

    cd thirdparty
    mkdir minizip-ng
    mkdir xz
    mkdir openssl
    mkdir bzip2
    
  • 参照编译脚本规则编写对应库的HPKBUILD脚本

  • xz三方库的HPKBUILD脚本
    xz库的编译构建方式是cmake编译构建,所以我们需要设置的基本变量信息:

    pkgname=xz  ## 库名
    pkgver=5.4.1 ## 库的版本号
    source="https://tukaani.org/$pkgname/$pkgname-$pkgver.tar.gz" ## 库的源码包路径
    buildtools="cmake"  ## xz库编译构建方式为cmakebuilddir=$pkgname-${pkgver} ## xz源码包解压后的文件夹名
    

    其他变量保持默认配置即可。cmake编译方式交叉编译环境变量是通过toolchain文件进行配置,因此在prepare时无需设置环境变量,只需要创建一个对应架构的编译路径即可:

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

    xz库编译时需要配置编译类型以及设置编译动态库,因此在cmake后面添加了对应的配置:-DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON,因此build函数需要如下修改:

    build() {cd $builddir${OHOS_SDK}/native/build-tools/cmake/bin/cmake $* -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DOHOS_ARCH=$ARCH -B$ARCH-build -S./ -L > `pwd`/$ARCH-build/build.log 2>&1make -j4 -C $ARCH-build >> `pwd`/$ARCH-build/build.log 2>&1ret=$?cd $OLDPWDreturn $ret
    }
    

    xz原生库测试是通过make test进行测试,对于在目标机上测试无需做其他修改,因此在check函数中只需说明测试方法即可“

    check() {echo "The test must be on an OpenHarmony device!"# real test CMD# 将编译目录加到 LD_LIBRARY_PATH 环境变量或者进入到编译目录# make test
    }
    

​ 其他函数可使用模板默认即可。xz完整编译脚本:xz HPKBUILD

  • openssl编译构建脚本HPKBUILD编写

    openssl库的编译构建方式是configure编译构建,因为 configure交叉编译是需要配置host类型的,且需要配置对应的环境变量,框架中基成了环境变量设置的接口,封装在envset.sh 中,因此我们除了基本信息外,还需要定义一个host变量以及导入envset.sh文件,基本变量信息修改如下:

    pkgname=openssl  ## 库名
    pkgver=OpenSSL_1_1_1t ## 库的版本号
    source="https://github.com/openssl/$pkgname/archive/refs/tags/$pkgver.zip" ## 库的源码包路径
    buildtools="configure"  ## 编译方式为configurebuilddir=$pkgname-${pkgver} ## openssl 源码包解压后的文件夹名source envset.sh      ## 导入envset.sh
    host=
    

    相比cmake编译方式,configure方式中的prepare()函数除了创建编译目录外,还需要配置对应架构的环境变量

    prepare() {mkdir -p $builddir/$ARCH-buildif [ $ARCH == ${archs[0]} ]thensetarm32ENVhost=linux-generic32fiif [ $ARCH == ${archs[1]} ]thensetarm64ENVhost=linux-aarch64fi
    }
    

    build()函数使用configure命令生成Makefile并执行make指令:

    build() {cd $builddir/$ARCH-build../Configure $* $host > `pwd`/build.log 2>&1make -j4 >> `pwd`/build.log 2>&1ret=$?cd $OLDPWDreturn $ret
    }
    

    openssl测试时需要单独通过编译目标depend生成测试用例,因此我们还需要修改对应的check()函数,在check函数中执行 make depend,并在执行完后清理对应的环境变量,而且在该函数后面通过注释说明该库在目标机上的测试方法。

    check() {cd $builddir/$ARCH-buildmake depend >> `pwd`/build.log 2>&1cd $OLDPWDif [ $ARCH == ${archs[0]} ]thenunsetarm32ENVfiif [ $ARCH == ${archs[1]} ]thenunsetarm64ENVfiunset hostecho "Test must be on an OpenHarmony device!"# real test CMD# 将编译目录加到 LD_LIBRARY_PATH 环境变量# make test}
    

    其他函数可使用模板默认的即可。openssl完整编译脚本openssl HPKBUILD.

  • bzip2三方库的HPKBUILD脚本

    bzip2原生库提供了Makefile,其编译构建方式就是make,对此我们需要分析原生库的Makefile,了解该库交叉编译需要设置哪些变量。对于bzip2库我们分析其交叉编译时只需要设置CC,AR和RANDLIB三方变量即可,因此我们在配置基本信息时需要额外定这三个变量:

    pkgname=bzip2  ## 库名
    pkgver=1.0.6 ## 库的版本号
    source="https://sourceforge.net/projects/$pkgname/files/$pkgname-$pkgver.tar.gz" ## 库的源码包路径
    buildtools="make"  ## 编译方式为makebuilddir=$pkgname-${pkgver} ## openssl 源码包解压后的文件夹名cc=
    ar=
    ranlib=
    

    三个变量需要根据编译架构进行赋值,我们在prepare函数中执行即可:

    prepare() {cp -rf $builddir $builddir-$ARCH-build  ## 为了保留构建环境(方便测试)。因此同一份源码在解压后分为两份,各自编译互不干扰cd $builddir-$ARCH-buildif [ $ARCH == ${archs[0]} ]thencc=${OHOS_SDK}/native/llvm/bin/arm-linux-ohos-clangar=${OHOS_SDK}/native/llvm/bin/llvm-arranlib=${OHOS_SDK}/native/llvm/bin/llvm-ranlibfiif [ $ARCH == ${archs[1]} ]thencc=${OHOS_SDK}/native/llvm/bin/aarch64-linux-ohos-clangar=${OHOS_SDK}/native/llvm/bin/llvm-arranlib=${OHOS_SDK}/native/llvm/bin/llvm-ranlibficd $OLDPWD # 1> /dev/null
    }
    

    编译时,我们需要将Makefile中需要的三个变量做为参数传入即可,而通过分析Makefile时知道,在执行make all时会执行make test测试导致make失败,因此我们也需要在make时指定需要编译的目标:

    build() {cd $builddir-$ARCH-buildmake CC=${cc} AR=${ar} RANLIB=${ranlib} -j4 libbz2.a bzip2 bzip2recover > `pwd`/build.log 2>&1ret=$?cd $OLDPWDreturn $ret
    }
    

    因为check函数无需做任何编译相关的动作,因此我们在package安装打包后需要清空对应的变量,而check函数只需要注释测试说明:

    package() {cd $builddir-$ARCH-build  # 进入到编译目录make install PREFIX=$LYCIUM_ROOT/usr/$pkgname-$ARCH-install >> `pwd`/build.log 2>&1 # 执行安装动作,此时需要配置对应的安装路径cd $OLDPWDunset cc ar ranlib      # 清空变量
    }
    check() {echo "Test must be on an OpenHarmony device!"# real test CMD# 将编译目录加到 LD_LIBRARY_PATH 环境变量或进入到编译目录:# make test
    }
    

    该库清理环境和之前库不一样,因为在prepare时是拷贝了对应的目录,因此清理时需要把拷贝的目录也删除:

    cleanbuild(){rm -rf ${PWD}/$builddir $builddir-armeabi-v7a-build  $builddir-arm64-v8a-build #${PWD}/$packagename
    }
    

    bzip完整的编译脚本可以参照:bzip2 HPKBUILD

  • minizip-ng三方库的HPKBUILD脚本

    minizip-ng三方库的编译方式是通过cmake,而且该库依赖了多个库,此时除了基本信息外,我们还需要填写其依赖库:

    pkgname=minizip-ng  # 库名
    pkgver=3.0.4        # 库版本
    depends=("xz" "openssl" "bzip2")  # minizip依赖的库
    source="https://github.com/zlib-ng/${pkgname}/archive/refs/tags/${pkgver}.tar.gz" # 库源码包链接
    buildtools="cmake"  # cmake编译方式builddir=$pkgname-${pkgver} # 源码包解压后名字
    

    函数设计中,build函数需要设置多个参数,其中包含

    1. 设置openssl依赖路径,因为openssl是通过configure编译的,其依赖路径必须通过PKG_CONFIG_PATH设置。
    2. 关闭一些未准备好的依赖库
    build() {cd $builddir## 此处将依赖库iconv以及zstd屏蔽,如有强制需求可以将此2库定义为true并在depends中加上这2个库的依赖PKG_CONFIG_PATH=${LYCIUM_ROOT}/usr/openssl-${ARCH}-install/lib/pkgconfig ${OHOS_SDK}/native/build-tools/cmake/bin/cmake $* -DMZ_ZSTD=false -DMZ_ICONV=false -DOHOS_ARCH=$ARCH -B$ARCH-build -S./ -L > `pwd`/$ARCH-build/build.log 2>&1make -j4 -C $ARCH-build >> `pwd`/$ARCH-build/build.log 2>&1ret=$?cd $OLDPWDreturn $ret
    }
    

    minizip 原生库未提供测试框架,因此无需在check中说明,其他函数使用模板默认即可。minizip-ng完整的编译脚本参照:Minizip-ng HPKBUILD

minizip编译构建

编写完HPKBUILD文件后,我们就可以进行三方库的编译了。在lycium目录执行如下指令进行编译:

./build.sh minizip-ng xz bzip2 openssl googletest

其中minizip-ng是我们需要编译的三方库,而xz,bzip2,openssl以及googletest是minizip-ng三方库的依赖库。进行编译完后,会在lycium/usr下生成对应架构的三方库的的库文件和头文件等。

minizip-ng/arm64-v8a minizip-ng/armeabi-v7a # 依赖库
openssl/arm64-v8a openssl/armeabi-v7a xz/arm64-v8a xz/armeabi-v7a zstd/arm64-v8a zstd/armeabi-v7a bzip2/arm64-v8a bzip2/armeabi-v7a

注意:

  • 有依赖库的必须将依赖库一起编译,否则框架无法进行编译。
  • 安装目录下对应的三方库有2份,其中armeabi-v7a对应的32位的库,arm64-v8a对应的是64位的库。

minizip在应用中的使用

minizip在应用中使用请参考文档minizip 集成到应用hap

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

回溯算法初识

文章目录 回溯算法初识什么是回溯算法回溯算法的步骤回溯算模版例题 回溯算法初识 什么是回溯算法 ​ 回溯算法是一种通过不断尝试可能的解决方案来解决问题的算法。它通常用于解决组合优化问题&#xff0c;如排列组合问题、子集和问题等。该算法通过尝试所有可能的候选解&am…

时序分解 | Matlab实现WOA-VMD鲸鱼算法WOA优化VMD变分模态分解

时序分解 | Matlab实现WOA-VMD鲸鱼算法WOA优化VMD变分模态分解 目录 时序分解 | Matlab实现WOA-VMD鲸鱼算法WOA优化VMD变分模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现WOA-VMD鲸鱼算法WOA优化VMD变分模态分解&#xff08;完整源码和数据) 1.利用鲸…

MySQL 全文检索

不是所有的数据表都支持全文检索 MySQL支持多种底层数据库引擎&#xff0c;但是并非所有的引擎支持全文检索 &#xff0c;目前最常用引擎是是MyISAM和InnoDB&#xff1b;前者支持全文检索&#xff0c;后者不支持。 booolean模式操作符 操作符含义必须有-必须不包含>包含对应…

建模设计软件 Archicad 27 for mac激活版

在建筑设计领域&#xff0c;每一次技术的革新都意味着设计效率和质量的飞跃。Archicad 27 for Mac&#xff0c;就是这样一款引领行业变革的设计软件。 Archicad 27凭借出色的性能优化和强大的功能更新&#xff0c;为Mac用户带来了前所未有的建筑设计体验。它支持BIM&#xff08…

洛谷P1263题解

题目描述 从前有一个王国&#xff0c;这个王国的城堡是 m 行 n 列的一个矩形&#xff0c;被分为 mn 个方格。一些方格是墙&#xff0c;而另一些是空地。这个王国的国王在城堡里设了一些陷阱&#xff0c;每个陷阱占据一块空地。 一天&#xff0c;国王决定在城堡里布置守卫&…

【日常记录】【JS】styled-components库的原理,模板字符串调用函数

文章目录 1、引言2、模板字符串调用函数3、实现 1、引言 在react 中&#xff0c;styled-components 是最流行的 css in js 模式的库 2、模板字符串调用函数 let stu {name: 呆呆狗,age: 30,address: 中国}let str fn你好${stu.name}今年${stu.age}岁,来自${stu.address}这样会…

3D室内装潢设计 Sweet Home 3D for Mac 中文直装版

Sweet Home 3D 是一款非常棒的家装辅助设计软件&#xff0c;支持包括中文在内的16中语言&#xff0c;它能帮您通过二维的家居平面图来设计和布置您的家具,还可以用三维的视角浏览整个装修布局的全貌。是一款操作起来简单方便&#xff0c;使用起来快捷、迅速&#xff0c;拥有超高…

什么是线程的上下文切换?

我们知道使用多线程的目的是为了充分利用多核CPU&#xff0c;比如说我们是16核&#xff0c;但是当创建很多线程比如说160个&#xff0c;CPU不够用了&#xff0c;此时就是一个CPU来应付多个线程&#xff08;这里我们是一个CPU应对10个线程&#xff09;。这个时候&#xff0c;操作…

HttpServletRequest/Response

HttpServletRequest 一些常用类的用法 package Demo;import javax.jws.WebService; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import ja…

CS 创世 SD NAND:嵌入式系统中的闪存存储利器

在当今数字化世界中&#xff0c;嵌入式系统的需求不断增长&#xff0c;而CS 创世 SD NAND作为一种关键的存储技术&#xff0c;正扮演着重要的角色。其高速、低功耗和较大存储容量的特点&#xff0c;使得它成为各种嵌入式设备的理想选择。 CS 创世 SD NAND 具有高度集成的特点&…

IntelliJ IDEA 2022.3.2 解决decompiled.class file bytecode version:52.0(java 8)

1 背景 使用idea 打开一个Kotlin语言编写的demo项目&#xff0c;该项目使用gradle构建。其gradle文件如下&#xff1a; plugins {id javaid org.jetbrains.kotlin.jvm version 1.8.20 } group me.administrator version 1.0-SNAPSHOTrepositories {mavenCentral()jcenter()…

低功耗高效能ARM架构助力自动化边缘小站建设

自动化边缘计算在智慧工厂中扮演着越来越重要的角色。其中&#xff0c;采用ARM架构的计算机因其独特的性能特点&#xff0c;在自动化边缘小站领域展现出了巨大的应用潜力。 ARM架构以其低功耗、高性能以及高度可定制化的优势&#xff0c;为构建高效率、低成本的自动化边缘小站…

YOLO系列 | 正负样本分配策略

文章目录 1 Max-IoU matching(YOLOv1~V3)2 Multi-Anchor策略(YOLOv4)3 基于宽高比的领域匹配策略(YOLOv5)4 simOTA(Simple Optimal Transport Assignment)匹配策略(YOLOX, YOLOv6)5 领域匹配simOTA(YOLOv7)6 TaskAlignedAssigner匹配策略(YOLOv8, YOLOv9)参考资料 1 Max-IoU ma…

【数据分析】嫡权法EWM

总结&#xff1a;基于熵值信息来计算出权重&#xff0c;数据具有客观性。 目录 简介 计算步骤 案例 简介 熵值法原理 熵值法的基本思路是根据指标变异性的大小来确定客观权重信息熵:信息量的期望。可以理解成不确定性的大小&#xff0c;不确定性越大&#xff0c;信息熵也就…

有条件的打破IBGP水平分割----反射规则和联邦+实验举例

背景&#xff1a;在一个AS中的设备运行了BGP协议&#xff0c;那么正常应该都连接了其他的AS&#xff0c;存在EBGP邻居关系&#xff1b;又由于IBGP的水平分割规则&#xff0c;导致从外部学习到的路由传递给本地AS时&#xff0c;需要和本地AS中运行BGP协议都要建立IBGP邻居关系&a…

使用spring-ai快速对接ChatGpt

什么是spring-ai Spring AI 是一个与 Spring 生态系统紧密集成的项目&#xff0c;旨在简化在基于 Spring 的应用程序中使用人工智能&#xff08;AI&#xff09;技术的过程。 简化集成&#xff1a;Spring AI 为开发者提供了方便的工具和接口&#xff0c;使得在 Spring 应用中集…

GRE/MGRE详解

GRE GRE&#xff1a;通用路由封装&#xff0c;是标准的三层隧道技术&#xff0c;是一种点对点的隧道技术&#xff1b; 该技术可以实现不同的网络之间安全的访问&#xff1b; 如上&#xff1a;可以使用该技术搭建一条专线&#xff0c;实现公司A与分公司A1之间相互通信&#xf…

AI Agent概念、能力初探

AI Agent无疑是大语言模型当前最热门且最具前景的方向&#xff0c;也是通往AGI的必经之路&#xff0c;下面我们从基本概念和系统能力层面来逐步揭开AI Agent的神秘面纱。 一、概念解析 1、什么是AI Agent&#xff1f; AI Agent&#xff08;人工智能代理&#xff09;是一种能够…

使用 ChatGPT-4 编码就像与一个醉酒的天才一起工作

我决定从头到尾使用 ChatGPT 来构建一个用于管理书签的 Chrome 扩展。在生成了 30,000 多行 JavaScript、HTML、CSS 和云后端后&#xff0c;我的收获是&#xff0c;使用 ChatGPT 进行编码就像与一个醉酒的编程天才一起工作&#xff1a;他很懒&#xff0c;患有记忆丧失&#xff…

从零实现诗词GPT大模型:专栏内容规划

一、前情介绍 本系列文章将从头编写一个类GPT的深度学习模型&#xff0c;并在诗词数据集上进行训练&#xff0c;从而可以进行诗词创作。 本次实现的类GPT模型&#xff0c;可以在kaggle上使用免费GPU进行训练&#xff0c;并可以在自己的电脑上进行推理&#xff0c;整个学习过程…