鸿蒙交叉编译OSS_C_SDK,已编译未测试

打印 上一主题 下一主题

主题 546|帖子 546|积分 1638

最新希望

07.19 已成功编译,暂未测试,产物及patch见下方,同伴们可以先用着,测试结果我会同步更新过来
说在前头

在编译oss_c_sdk中遇到的坑和问题,当前依然在坑中,旨在资助有雷同手动适配想法的兄弟减少工作量,也渴望有新希望和我同步下,感激不尽
环境预备


  • 预备Linux系统(实验过MacOS,不太顺遂)
  • 下载工具链:https://developer.huawei.com/consumer/cn/download/

  • 直接贴下令行:
  1. # 创建文件夹并进入
  2. mkdir -p /home/ohos && cd /home/ohos
  3. # 把下载好的command-line-toolsxxxx.zip放到这里来后执行
  4. unzip command-line-toolxxxxxxx.zip
  5. # 安装cmake, command-line-tool中的cmake版本过低,
  6. apt install cmake -y  # 或
  7. dnf install cmake -y
  8. # 配置环境变量,建议配置在 /etc/profile 或用户profile里
  9. vi /etc/profile
  10. # 在最下面添加一行
  11. export OHOS_SDK=/home/ohos/command-line-tools/sdk/HarmonyOS-NEXT-DB1/openharmony
  12. # :wq!后 执行
  13. source /etc/profile
  14. echo $OHOS_SDK # 验证
  15. # tpc_c_cplusplus准备
  16. cd /home/ohos && git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git && cd tpc_c_cplusplus
  17. # 进入到工具包目录
  18. cd lycium/Buildtools
  19. # 若输出"toolchain.tar.gz: OK"则说明工具包正常
  20. # 否则说明工具包异常,需重新下载
  21. sha512sum -c SHA512SUM
  22. # 解压拷贝编译工具                  
  23. tar -zxvf toolchain.tar.gz
  24. # 将命令拷贝到工具链的native/llvm/bin目录下
  25. cp toolchain/* ${OHOS_SDK}/native/llvm/bin
  26. # 设置编译机cmake识别OHOS系统
  27. # cp $OHOS_SDK/native/build-tools/cmake/share/cmake-3.16/Modules/Platform/OHOS.cmake \
  28. # xxx(代表你编译机安装的cmake的路径)/Modules/Platform
  29. # 我这里是/usr/share/cmake/Modules/Platform
  30. cp $OHOS_SDK/native/build-tools/cmake/share/cmake-3.16/Modules/Platform/OHOS.cmake /usr/share/cmake/Modules/Platform
复制代码
了解lycium工具

https://gitee.com/openharmony-sig/tpc_c_cplusplus/tree/master/lycium#/openharmony-sig/tpc_c_cplusplus/blob/master/lycium/Buildtools/README.md
总结:
在thirdparty里面定义要编译的包信息,每次编译都会主动清算、主动下载(仅第一次),主动解压,就是依次实行HPKBUILD里面的clean, prepare, build 和 package
了解Aliyun_OSS_C_SDK

https://github.com/aliyun/aliyun-oss-c-sdk?tab=readme-ov-file

  • 本次编译须要4个依靠库 curl, apr, apr-util, minixml
  • 非交叉编译的情况非常简朴,参考下即可
  1. # 安装CMake
  2. sudo yum install cmake # 或
  3. sudo apt-get install cmake # 或
  4. sudo zypper install cmake
  5. # 安装第三方库 (RedHat/Aliyun/CentOS)
  6. yum -y install libcurl-devel
  7. yum install apr-util
  8. yum install apr-devel
  9. yum install apr-util-devel
  10. wget "https://github.com/michaelrsweet/mxml/releases/download/release-2.9/mxml-2.9.tar.gz"
  11. tar zxf mxml-2.9.tar.gz
  12. cd mxml-2.9
  13. ./configure
  14. make
  15. sudo make install
  16. # 安装三方库 (Ubuntu/Debian)
  17. sudo apt-get install libcurl4-openssl-dev libapr1-dev libaprutil1-dev libmxml-dev
  18. # 安装三方库(SuSE)
  19. sudo zypper install libcurl-devel libapr1-devel libapr-util1-devel mxml-devel
  20. # 安装C SDK
  21. # https://github.com/aliyun/aliyun-oss-c-sdk/releases
  22. tar zxf aliyun-oss-c-sdk-3.10.0.tar.gz
  23. cd aliyun-oss-c-sdk-3.10.0
  24. cmake .
  25. make
  26. sudo make install
  27. cmake -f CMakeLists.txt
  28. // 编译类型为Release。常用的编译类型为:Debug、Release、RelWithDebInfo和MinSizeRel,默认使用Debug。
  29. -DCMAKE_BUILD_TYPE=Release
  30. // 自定义安装目录。
  31. -DCMAKE_INSTALL_PREFIX=/usr/local/
  32. // 指定curl、apr、apr-util和xml第三方库头文件和库文件的所在目录。
  33. -DCURL_INCLUDE_DIR=/usr/include/curl
  34. -DCURL_LIBRARY=/usr/lib64/libcurl.so
  35. -DAPR_INCLUDE_DIR=/usr/include/apr-1
  36. -DAPR_LIBRARY=/usr/lib64/libapr-1.so
  37. -DAPR_UTIL_INCLUDE_DIR=/usr/include/apr-1
  38. -DAPR_UTIL_LIBRARY=/usr/lib64/libaprutil-1.so
  39. -DMINIXML_INCLUDE_DIR=/usr/include
  40. -DMINIXML_LIBRARY=/usr/lib64/libmxml.so
  41. // 编译时报错Could not find apr-config/apr-1-config,原因是在默认路径里面找不到apr-1-config文件,请添加该选项。
  42. -DAPR_CONFIG_BIN=/path/to/bin/apr-1-config
  43. // 编译时报错Could not find apu-config/apu-1-config,原因是在默认路径里面找不到apu-1-config文件,请添加该选项。
  44. -DAPU_CONFIG_BIN=/path/to/bin/apu-1-config
  45. # 编译示例工程
  46. wget https://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/32132/cn_zh/1487730555529/aliyun-oss-c-sdk-demo.tar.gz
  47. tar zxf aliyun-oss-c-sdk-demo.tar.gz
  48. # 进入工程目录(oss-c-sdk-demo-xxx)执行make,编译示例工程。
  49. cd oss-c-sdk-demo-xxx && make
复制代码
STEP BY STEP

接下来编译的都是arm64-v8a架构的,须要手动把thirdparty下对应的HPKBUILD里面的v7a干掉,参考
  1. pkgname=minixml
  2. pkgver=3.3.1
  3. pkgrel=0
  4. pkgdesc="Mini-XML is a small XML parsing library that you can use to read XML data files or strings in your application without requiring large non-standard libraries."
  5. url="www.msweet.org/mxml"
  6. #重点看这里,只保留arm64-v8a
  7. archs=("arm64-v8a")
  8. license=("Apache License 2.0")
  9. depends=()
  10. makedepends=()
复制代码
编译curl

  1. yum install perl -y
  2. yum install libtool -y
  3. yum install autoconf -y
  4. yum insatll m4 -y
  5. # 执行这个顶掉yum安装的libtool, 有个依赖库需要2.2.6b版本
  6. wget http://mirrors.kernel.org/gnu/libtool/libtool-2.2.6b.tar.gz \
  7. tar xzvf libtool-2.2.6b.tar.gz \
  8. cd libtool-2.2.6b \
  9. ./configure --prefix=/usr
  10. make
  11. make install
  12. cd ..
  13. # 进入lycium目录编译curl
  14. cd /home/ohos/tpc_c_cplusplus/lycium
  15. ./build.sh curl
  16. # 注意观察libtool报错,版本过低的话,重新安装后重新执行编译
  17. yum remove libtool
  18. yum install libtool -y
  19. ./build.sh curl
复制代码
编译apr

  1. # 进入lycium目录编译apr
  2. cd /home/ohos/tpc_c_cplusplus/lycium
  3. ./build.sh curl
  4. # 注意观察libtool报错,版本过低的话,重新安装后重新执行编译
  5. yum remove libtool
  6. yum install libtool -y
  7. ./build.sh curl
复制代码
编译apr-util

包内不存在apr-util, 须要本身新增,直接贴代码
  1. cd /home/ohos/tpc_c_cplusplus/thirdparty && mkdir apr-util && cd apr-util
  2. touch HPKBUILD
  3. touch SHA512SUM
复制代码
HPKBUILD内容
  1. pkgname=apr-util
  2. pkgver=1.6.3
  3. pkgrel=0
  4. pkgdesc="APR-util provides a number of helpful abstractions on top of APR."
  5. url="https://apr.apache.org"
  6. archs=("arm64-v8a")
  7. license=("Apache License 2.0")
  8. depends=()
  9. makedepends=()
  10. source="https://dlcdn.apache.org//apr/apr-util-1.6.3.tar.gz"
  11. autounpack=true
  12. downloadpackage=true
  13. patchflag=true
  14. buildtools="configure"
  15. builddir=$pkgname-${pkgver}
  16. packagename=$builddir.tar.gz
  17. source envset.sh
  18. host=
  19. prepare() {
  20.     if $patchflag
  21.     then
  22.         cd  $builddir
  23.         # 三方库中线程未实现,
  24.         # patch -p1 < `pwd`/../apr_oh_test.patch
  25.         # patch只需要打一次,关闭打patch
  26.         patchflag=false
  27.         cd $OLDPWD
  28.     fi
  29.     cp -rf ${builddir} $builddir-${ARCH}-build
  30.     if [ $ARCH == "armeabi-v7a" ]
  31.     then
  32.         setarm32ENV
  33.         host=arm-linux
  34.     elif [ $ARCH == "arm64-v8a" ]
  35.     then
  36.         setarm64ENV
  37.         host=aarch64-linux
  38.     else
  39.         echo "$ARCH not support!"
  40.         return -1
  41.     fi
  42. }
  43. # ac_cv_file__dev_zero:表示检测系统中是否有名为/dev/zero的文件。
  44. # ac_cv_func_setpgrp_void:表示检测系统中是否存在带有void类型参数的setpgrp函数。
  45. # apr_cv_process_shared_works:表示检测系统中是否支持进程间共享内存。
  46. # apr_cv_mutex_robust_shared:表示检测系统中是否支持共享互斥锁的鲁棒性。
  47. # apr_cv_tcp_nodelay_with_cork:表示检测系统中是否支持同时启用TCP_NODELAY和TCP_CORK的选项。
  48. # ap_void_ptr_lt_long:表示比较void*指针和long类型的整数时,void*是否小于long类型的整数。
  49. # TCP_NODELAY=0 TCP_CORK=0:禁用 TCP_NODELAY 和 TCP_CORK 选项,以避免网络传输延迟。
  50. # ac_cv_struct_rlimit:检查系统是否支持结构体 rlimit,用于限制进程的资源使用。
  51. # ap_cv_void_ptr_lt_long:表示 `void*` 指针类型是否比 `long` 类型更小
  52. build() {
  53.     cd $builddir-${ARCH}-build
  54.     ./configure "$@" --host=$host CFLAGS="-Wno-error=int-conversion" --enable-so  --with-mpm=worker --with-apr=$LYCIUM_ROOT/usr/apr/$ARCH --prefix=$LYCIUM_ROOT/usr/apr/$ARCH > `pwd`/build.log 2>&1
  55.     make -j4 VERBOSE=1 >> `pwd`/build.log 2>&1
  56.     ret=$?
  57.     cd $OLDPWD
  58.     cd $builddir-${ARCH}-build/test
  59.     make -j4 VERBOSE=1 >> `pwd`/build.log 2>&1
  60.     cd $OLDPWD
  61.     return $ret
  62. }
  63. package() {
  64.     cd $builddir-${ARCH}-build
  65.     make install >> `pwd`/build.log 2>&1
  66.     ret=$?
  67.     cd $OLDPWD
  68.     unset host
  69.     if [ $ARCH == "armeabi-v7a" ]
  70.     then
  71.         unsetarm32ENV
  72.     elif [ $ARCH == "arm64-v8a" ]
  73.     then
  74.         unsetarm64ENV
  75.     else
  76.         echo "$ARCH not support!"
  77.         return -1
  78.     fi
  79.     return $ret
  80. }
  81. check() {
  82.     echo "The test must be on an OpenHarmony device!"
  83.     # cd $builddir-${ARCH}-build/test
  84.     # ./testall
  85. }
  86. # 清理环境
  87. cleanbuild(){
  88.     rm -rf ${PWD}/${builddir} ${PWD}/${builddir}-armeabi-v7a-build ${PWD}/${builddir}-arm64-v8a-build #${PWD}/$packagename
  89. }
复制代码
SHA512SUM内容
  1. 25f078413dc552b3391845b3dc1da72773efe181634deb2f88a9c72a1a49c82883113704bf97db8327012ccafb84a68370267925e3c7cc092ed82fc33fd7954e  apr-util-1.6.3.tar.gz
复制代码
不对的话 本技艺动下载厥后一下,并粘贴到SHA512SUM去
  1. shasum -a 512 apr-util-1.6.3.tar.gz
复制代码
末了还是一样的
  1. # 进入lycium目录编译apr-util
  2. cd /home/ohos/tpc_c_cplusplus/lycium
  3. ./build.sh curl-util
复制代码
编译minixml

编译的是3.x.x版本,官方说4.x.x版本不向后兼容
  1. cd /home/ohos/tpc_c_cplusplus/thirdparty && mkdir minixml && cd minixml
  2. touch HPKBUILD
  3. touch SHA512SUM
复制代码
HPKBUILD
  1. pkgname=minixml
  2. pkgver=3.3.1
  3. pkgrel=0
  4. pkgdesc="Mini-XML is a small XML parsing library that you can use to read XML data files or strings in your application without requiring large non-standard libraries."
  5. url="www.msweet.org/mxml"
  6. archs=("arm64-v8a")
  7. license=("Apache License 2.0")
  8. depends=()
  9. makedepends=()
  10. source="https://github.com/michaelrsweet/mxml/releases/download/v3.3.1/mxml-3.3.1.tar.gz"
  11. autounpack=true
  12. downloadpackage=true
  13. patchflag=true
  14. buildtools="configure"
  15. builddir=mxml-3.3.1
  16. packagename=mxml-3.3.1.tar.gz
  17. source envset.sh
  18. host=
  19. prepare() {
  20.     if $patchflag
  21.     then
  22.         cd  $builddir
  23.         # 三方库中线程未实现,
  24.         # patch -p1 < `pwd`/../apr_oh_test.patch
  25.         # patch只需要打一次,关闭打patch
  26.         patchflag=false
  27.         cd $OLDPWD
  28.     fi
  29.     cp -rf ${builddir} $builddir-${ARCH}-build
  30.     if [ $ARCH == "armeabi-v7a" ]
  31.     then
  32.         setarm32ENV
  33.         host=arm-linux
  34.     elif [ $ARCH == "arm64-v8a" ]
  35.     then
  36.         setarm64ENV
  37.         host=aarch64-linux
  38.     else
  39.         echo "$ARCH not support!"
  40.         return -1
  41.     fi
  42. }
  43. build() {
  44.     cd $builddir-${ARCH}-build
  45.     ./configure "$@" --host=$host CFLAGS="-Wno-error=int-conversion" --enable-so --prefix=$LYCIUM_ROOT/usr/$pkgname/$ARCH > `pwd`/build.log 2>&1
  46.     make -j4 VERBOSE=1 >> `pwd`/build.log 2>&1
  47.     ret=$?
  48.     cd $OLDPWD
  49.     cd $builddir-${ARCH}-build/test
  50.     make -j4 VERBOSE=1 >> `pwd`/build.log 2>&1
  51.     cd $OLDPWD
  52.     return $ret
  53. }
  54. package() {
  55.     cd $builddir-${ARCH}-build
  56.     make install >> `pwd`/build.log 2>&1
  57.     ret=$?
  58.     cd $OLDPWD
  59.     unset host
  60.     if [ $ARCH == "armeabi-v7a" ]
  61.     then
  62.         unsetarm32ENV
  63.     elif [ $ARCH == "arm64-v8a" ]
  64.     then
  65.         unsetarm64ENV
  66.     else
  67.         echo "$ARCH not support!"
  68.         return -1
  69.     fi
  70.     return $ret
  71. }
  72. check() {
  73.     echo "The test must be on an OpenHarmony device!"
  74.     # cd $builddir-${ARCH}-build/test
  75.     # ./testall
  76. }
  77. # 清理环境
  78. cleanbuild(){
  79.     rm -rf ${PWD}/${builddir} ${PWD}/${builddir}-armeabi-v7a-build ${PWD}/${builddir}-arm64-v8a-build #${PWD}/$packagename
  80. }
复制代码
SHA512SUM
  1. ad72a19d4c1d06e44338b37e1ab3f13220b8bcba0bf5504cff9cef6e5eb0681aa51ec473219c20398ce3614c1bc1f1ca2fc490bf99b50a8896fb5ee3efb27c5c  mxml-3.3.1.tar.gz
复制代码
末了
  1. # 进入lycium目录编译minixml
  2. cd /home/ohos/tpc_c_cplusplus/lycium
  3. ./build.sh minixml
复制代码
编译Aliyun_oss_c_sdk

新建third-party库

  1. cd /home/ohos/tpc_c_cplusplus/thirdparty && mkdir aliyun-oss-c-sdk && cd aliyun-oss-c-sdk
  2. touch HPKBUILD
  3. touch SHA512SUM
复制代码
patch

须要对CMakeLists.txt打补丁
在tpc_c_cplusplus/thirdparty/aliyun-oss-c-sdk下新建oss_c_sdk_oh_pkg.patch,
  1. touch oss_c_sdk_oh_pkg.patch
复制代码
并粘贴
  1. diff -rupN aliyun-oss-c-sdk-3.11.0/CMakeLists.txt aliyun-oss-c-sdk-3.11.0_patch/CMakeLists.txt
  2. --- aliyun-oss-c-sdk-3.11.0/CMakeLists.txt        2023-03-20 21:49:10.000000000 +0800
  3. +++ aliyun-oss-c-sdk-3.11.0/CMakeLists.txt        2023-05-10 14:51:49.579039952 +0800
  4. @@ -117,4 +117,5 @@ include_directories(${APR_INCLUDE_DIR})
  5. include_directories(${MINIXML_INCLUDE_DIR})
  6. include_directories(${CURL_INCLUDE_DIR})
  7. +link_libraries("-Wl,--allow-shlib-undefined" ${CURL_LIBRARY} ${APR_LIBRARY} ${APR_UTIL_LIBRARY} ${MINIXML_LIBRARY})
  8. aux_source_directory(oss_c_sdk SRC_LIST)
复制代码
打补丁动作写在HPKBUILD内,构建时会主动打
SHA512SUM

  1. 0a382d3ac90f7ae40d70e200b06c26a869e890634ab696eb9c557300682dedd30cf1f84ddde9f6fa3ce789f4320da14713aa3650f55c89964206f087f630c648  aliyun-oss-c-sdk-3.11.0.tar.gz
  2. 8a253b847a8ba237b04192f3bcafe8cc20c29cba9d877ae6e9864e52c5662376607a0a64154e9a27e289b4058942ff1d4d97ea99c07eedd48455c748da15be9d  oss_c_sdk_oh_pkg.patch
复制代码
若oss_c_sdk_oh_pkg.patch不匹配,则手动搞一下再换一下,参考上面
HPKBUILD

  1. pkgname=aliyun-oss-c-sdk
  2. pkgver=3.11.0
  3. pkgrel=0
  4. pkgdesc="Alibaba Cloud Object Storage Service (OSS) is a cloud storage service provided by Alibaba Cloud, featuring massive capacity, security, a low cost, and high reliability."
  5. url="http://oss.aliyun.com/"
  6. archs=("arm64-v8a")
  7. license=("Apache License 2.0")
  8. depends=("curl" "apr" "apr-util" "minixml")
  9. makedepends=()
  10. source="https://github.com/aliyun/aliyun-oss-c-sdk/archive/refs/tags/3.11.0.tar.gz"
  11. autounpack=true
  12. downloadpackage=true
  13. patchflag=true
  14. buildtools="cmake"
  15. builddir=aliyun-oss-c-sdk-3.11.0
  16. packagename=aliyun-oss-c-sdk-3.11.0.tar.gz
  17. patchflag=true
  18. prepare() {
  19.     if $patchflag
  20.     then
  21.         cd $builddir
  22.         # 编译识别 OpenHarmony 系统
  23.         patch -p1 < `pwd`/../oss_c_sdk_oh_pkg.patch
  24.         # patch只需要打一次,关闭打patch
  25.         patchflag=false
  26.         cd $OLDPWD
  27.     fi
  28.     mkdir -p $builddir/$ARCH-build
  29. }
  30. build() {
  31.     cd $builddir
  32.     cmake -DCMAKE_TOOLCHAIN_FILE=${OHOS_SDK}/native/build/cmake/ohos.toolchain.cmake "$@" -DOHOS_ARCH=$ARCH -DCURL_INCLUDE_DIR=$LYCIUM_ROOT/usr/curl/$ARCH/include -DCURL_LIBRARY=$LYCIUM_ROOT/usr/curl/$ARCH/lib/libcurl.so -DAPR_INCLUDE_DIR=$LYCIUM_ROOT/usr/apr/$ARCH/include/apr-1 -DAPR_LIBRARY=$LYCIUM_ROOT/usr/apr/$ARCH/lib/libapr-1.so -DAPR_UTIL_INCLUDE_DIR=$LYCIUM_ROOT/usr/apr/$ARCH/include/apr-1 -DAPR_UTIL_LIBRARY=$LYCIUM_ROOT/usr/apr/$ARCH/lib/libaprutil-1.so -DMINIXML_INCLUDE_DIR=$LYCIUM_ROOT/usr/minixml/$ARCH/include -DMINIXML_LIBRARY=$LYCIUM_ROOT/usr/minixml/$ARCH/lib/libmxml.so -DAPR_CONFIG_BIN=$LYCIUM_ROOT/usr/apr/$ARCH/bin/apr-1-config -DAPU_CONFIG_BIN=$LYCIUM_ROOT/usr/apr/$ARCH/bin/apu-1-config -B$ARCH-build -S./ -L > `pwd`/$ARCH-build/build.log 2>&1
  33.     make -j4 -C $ARCH-build >> `pwd`/$ARCH-build/build.log 2>&1
  34.     ret=$?
  35.     cd $OLDPWD
  36.     return $ret
  37. }
  38. package() {
  39.     cd "$builddir"
  40.     make -C $ARCH-build install >> `pwd`/$ARCH-build/build.log 2>&1
  41.     cd $OLDPWD
  42. }
  43. check() {
  44.     echo "The test must be on an OpenHarmony device!"
  45. }
  46. # 清理环境
  47. cleanbuild(){
  48.     rm -rf ${PWD}/$builddir #${PWD}/$packagename
  49. }
复制代码
末了
  1. # 进入lycium目录编译aliyun-oss-c-sdk
  2. cd /home/ohos/tpc_c_cplusplus/lycium
  3. ./build.sh aliyun-oss-c-sdk
复制代码
产物

https://github.com/htliang128/tpc_c_cplusplus/tree/main/lycium/usr
参考


  • tpc_c_cplusplus
  • 阿里云OSS官方文档

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

杀鸡焉用牛刀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表