鸿蒙交叉编译OSS_C_SDK,已编译未测试
最新希望07.19 已成功编译,暂未测试,产物及patch见下方,同伴们可以先用着,测试结果我会同步更新过来
说在前头
在编译oss_c_sdk中遇到的坑和问题,当前依然在坑中,旨在资助有雷同手动适配想法的兄弟减少工作量,也渴望有新希望和我同步下,感激不尽
环境预备
[*]预备Linux系统(实验过MacOS,不太顺遂)
[*]下载工具链:https://developer.huawei.com/consumer/cn/download/
https://i-blog.csdnimg.cn/direct/fe2a39d8146f497e923b7ea3cacdc89e.png
[*]直接贴下令行:
# 创建文件夹并进入
mkdir -p /home/ohos && cd /home/ohos
# 把下载好的command-line-toolsxxxx.zip放到这里来后执行
unzip command-line-toolxxxxxxx.zip
# 安装cmake, command-line-tool中的cmake版本过低,
apt install cmake -y# 或
dnf install cmake -y
# 配置环境变量,建议配置在 /etc/profile 或用户profile里
vi /etc/profile
# 在最下面添加一行
export OHOS_SDK=/home/ohos/command-line-tools/sdk/HarmonyOS-NEXT-DB1/openharmony
# :wq!后 执行
source /etc/profile
echo $OHOS_SDK # 验证
# tpc_c_cplusplus准备
cd /home/ohos && git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git && cd tpc_c_cplusplus
# 进入到工具包目录
cd lycium/Buildtools
# 若输出"toolchain.tar.gz: OK"则说明工具包正常
# 否则说明工具包异常,需重新下载
sha512sum -c SHA512SUM
# 解压拷贝编译工具
tar -zxvf toolchain.tar.gz
# 将命令拷贝到工具链的native/llvm/bin目录下
cp toolchain/* ${OHOS_SDK}/native/llvm/bin
# 设置编译机cmake识别OHOS系统
# cp $OHOS_SDK/native/build-tools/cmake/share/cmake-3.16/Modules/Platform/OHOS.cmake \
# xxx(代表你编译机安装的cmake的路径)/Modules/Platform
# 我这里是/usr/share/cmake/Modules/Platform
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
[*]非交叉编译的情况非常简朴,参考下即可
# 安装CMake
sudo yum install cmake # 或
sudo apt-get install cmake # 或
sudo zypper install cmake
# 安装第三方库 (RedHat/Aliyun/CentOS)
yum -y install libcurl-devel
yum install apr-util
yum install apr-devel
yum install apr-util-devel
wget "https://github.com/michaelrsweet/mxml/releases/download/release-2.9/mxml-2.9.tar.gz"
tar zxf mxml-2.9.tar.gz
cd mxml-2.9
./configure
make
sudo make install
# 安装三方库 (Ubuntu/Debian)
sudo apt-get install libcurl4-openssl-dev libapr1-dev libaprutil1-dev libmxml-dev
# 安装三方库(SuSE)
sudo zypper install libcurl-devel libapr1-devel libapr-util1-devel mxml-devel
# 安装C SDK
# https://github.com/aliyun/aliyun-oss-c-sdk/releases
tar zxf aliyun-oss-c-sdk-3.10.0.tar.gz
cd aliyun-oss-c-sdk-3.10.0
cmake .
make
sudo make install
cmake -f CMakeLists.txt
// 编译类型为Release。常用的编译类型为:Debug、Release、RelWithDebInfo和MinSizeRel,默认使用Debug。
-DCMAKE_BUILD_TYPE=Release
// 自定义安装目录。
-DCMAKE_INSTALL_PREFIX=/usr/local/
// 指定curl、apr、apr-util和xml第三方库头文件和库文件的所在目录。
-DCURL_INCLUDE_DIR=/usr/include/curl
-DCURL_LIBRARY=/usr/lib64/libcurl.so
-DAPR_INCLUDE_DIR=/usr/include/apr-1
-DAPR_LIBRARY=/usr/lib64/libapr-1.so
-DAPR_UTIL_INCLUDE_DIR=/usr/include/apr-1
-DAPR_UTIL_LIBRARY=/usr/lib64/libaprutil-1.so
-DMINIXML_INCLUDE_DIR=/usr/include
-DMINIXML_LIBRARY=/usr/lib64/libmxml.so
// 编译时报错Could not find apr-config/apr-1-config,原因是在默认路径里面找不到apr-1-config文件,请添加该选项。
-DAPR_CONFIG_BIN=/path/to/bin/apr-1-config
// 编译时报错Could not find apu-config/apu-1-config,原因是在默认路径里面找不到apu-1-config文件,请添加该选项。
-DAPU_CONFIG_BIN=/path/to/bin/apu-1-config
# 编译示例工程
wget https://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/32132/cn_zh/1487730555529/aliyun-oss-c-sdk-demo.tar.gz
tar zxf aliyun-oss-c-sdk-demo.tar.gz
# 进入工程目录(oss-c-sdk-demo-xxx)执行make,编译示例工程。
cd oss-c-sdk-demo-xxx && make
STEP BY STEP
接下来编译的都是arm64-v8a架构的,须要手动把thirdparty下对应的HPKBUILD里面的v7a干掉,参考
pkgname=minixml
pkgver=3.3.1
pkgrel=0
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."
url="www.msweet.org/mxml"
#重点看这里,只保留arm64-v8a
archs=("arm64-v8a")
license=("Apache License 2.0")
depends=()
makedepends=()
编译curl
yum install perl -y
yum install libtool -y
yum install autoconf -y
yum insatll m4 -y
# 执行这个顶掉yum安装的libtool, 有个依赖库需要2.2.6b版本
wget http://mirrors.kernel.org/gnu/libtool/libtool-2.2.6b.tar.gz \
tar xzvf libtool-2.2.6b.tar.gz \
cd libtool-2.2.6b \
./configure --prefix=/usr
make
make install
cd ..
# 进入lycium目录编译curl
cd /home/ohos/tpc_c_cplusplus/lycium
./build.sh curl
# 注意观察libtool报错,版本过低的话,重新安装后重新执行编译
yum remove libtool
yum install libtool -y
./build.sh curl
编译apr
# 进入lycium目录编译apr
cd /home/ohos/tpc_c_cplusplus/lycium
./build.sh curl
# 注意观察libtool报错,版本过低的话,重新安装后重新执行编译
yum remove libtool
yum install libtool -y
./build.sh curl
编译apr-util
包内不存在apr-util, 须要本身新增,直接贴代码
cd /home/ohos/tpc_c_cplusplus/thirdparty && mkdir apr-util && cd apr-util
touch HPKBUILD
touch SHA512SUM
HPKBUILD内容
pkgname=apr-util
pkgver=1.6.3
pkgrel=0
pkgdesc="APR-util provides a number of helpful abstractions on top of APR."
url="https://apr.apache.org"
archs=("arm64-v8a")
license=("Apache License 2.0")
depends=()
makedepends=()
source="https://dlcdn.apache.org//apr/apr-util-1.6.3.tar.gz"
autounpack=true
downloadpackage=true
patchflag=true
buildtools="configure"
builddir=$pkgname-${pkgver}
packagename=$builddir.tar.gz
source envset.sh
host=
prepare() {
if $patchflag
then
cd$builddir
# 三方库中线程未实现,
# patch -p1 < `pwd`/../apr_oh_test.patch
# patch只需要打一次,关闭打patch
patchflag=false
cd $OLDPWD
fi
cp -rf ${builddir} $builddir-${ARCH}-build
if [ $ARCH == "armeabi-v7a" ]
then
setarm32ENV
host=arm-linux
elif [ $ARCH == "arm64-v8a" ]
then
setarm64ENV
host=aarch64-linux
else
echo "$ARCH not support!"
return -1
fi
}
# ac_cv_file__dev_zero:表示检测系统中是否有名为/dev/zero的文件。
# ac_cv_func_setpgrp_void:表示检测系统中是否存在带有void类型参数的setpgrp函数。
# apr_cv_process_shared_works:表示检测系统中是否支持进程间共享内存。
# apr_cv_mutex_robust_shared:表示检测系统中是否支持共享互斥锁的鲁棒性。
# apr_cv_tcp_nodelay_with_cork:表示检测系统中是否支持同时启用TCP_NODELAY和TCP_CORK的选项。
# ap_void_ptr_lt_long:表示比较void*指针和long类型的整数时,void*是否小于long类型的整数。
# TCP_NODELAY=0 TCP_CORK=0:禁用 TCP_NODELAY 和 TCP_CORK 选项,以避免网络传输延迟。
# ac_cv_struct_rlimit:检查系统是否支持结构体 rlimit,用于限制进程的资源使用。
# ap_cv_void_ptr_lt_long:表示 `void*` 指针类型是否比 `long` 类型更小
build() {
cd $builddir-${ARCH}-build
./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
make -j4 VERBOSE=1 >> `pwd`/build.log 2>&1
ret=$?
cd $OLDPWD
cd $builddir-${ARCH}-build/test
make -j4 VERBOSE=1 >> `pwd`/build.log 2>&1
cd $OLDPWD
return $ret
}
package() {
cd $builddir-${ARCH}-build
make install >> `pwd`/build.log 2>&1
ret=$?
cd $OLDPWD
unset host
if [ $ARCH == "armeabi-v7a" ]
then
unsetarm32ENV
elif [ $ARCH == "arm64-v8a" ]
then
unsetarm64ENV
else
echo "$ARCH not support!"
return -1
fi
return $ret
}
check() {
echo "The test must be on an OpenHarmony device!"
# cd $builddir-${ARCH}-build/test
# ./testall
}
# 清理环境
cleanbuild(){
rm -rf ${PWD}/${builddir} ${PWD}/${builddir}-armeabi-v7a-build ${PWD}/${builddir}-arm64-v8a-build #${PWD}/$packagename
}
SHA512SUM内容
25f078413dc552b3391845b3dc1da72773efe181634deb2f88a9c72a1a49c82883113704bf97db8327012ccafb84a68370267925e3c7cc092ed82fc33fd7954eapr-util-1.6.3.tar.gz
不对的话 本技艺动下载厥后一下,并粘贴到SHA512SUM去
shasum -a 512 apr-util-1.6.3.tar.gz
末了还是一样的
# 进入lycium目录编译apr-util
cd /home/ohos/tpc_c_cplusplus/lycium
./build.sh curl-util
编译minixml
编译的是3.x.x版本,官方说4.x.x版本不向后兼容
cd /home/ohos/tpc_c_cplusplus/thirdparty && mkdir minixml && cd minixml
touch HPKBUILD
touch SHA512SUM
HPKBUILD
pkgname=minixml
pkgver=3.3.1
pkgrel=0
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."
url="www.msweet.org/mxml"
archs=("arm64-v8a")
license=("Apache License 2.0")
depends=()
makedepends=()
source="https://github.com/michaelrsweet/mxml/releases/download/v3.3.1/mxml-3.3.1.tar.gz"
autounpack=true
downloadpackage=true
patchflag=true
buildtools="configure"
builddir=mxml-3.3.1
packagename=mxml-3.3.1.tar.gz
source envset.sh
host=
prepare() {
if $patchflag
then
cd$builddir
# 三方库中线程未实现,
# patch -p1 < `pwd`/../apr_oh_test.patch
# patch只需要打一次,关闭打patch
patchflag=false
cd $OLDPWD
fi
cp -rf ${builddir} $builddir-${ARCH}-build
if [ $ARCH == "armeabi-v7a" ]
then
setarm32ENV
host=arm-linux
elif [ $ARCH == "arm64-v8a" ]
then
setarm64ENV
host=aarch64-linux
else
echo "$ARCH not support!"
return -1
fi
}
build() {
cd $builddir-${ARCH}-build
./configure "$@" --host=$host CFLAGS="-Wno-error=int-conversion" --enable-so --prefix=$LYCIUM_ROOT/usr/$pkgname/$ARCH > `pwd`/build.log 2>&1
make -j4 VERBOSE=1 >> `pwd`/build.log 2>&1
ret=$?
cd $OLDPWD
cd $builddir-${ARCH}-build/test
make -j4 VERBOSE=1 >> `pwd`/build.log 2>&1
cd $OLDPWD
return $ret
}
package() {
cd $builddir-${ARCH}-build
make install >> `pwd`/build.log 2>&1
ret=$?
cd $OLDPWD
unset host
if [ $ARCH == "armeabi-v7a" ]
then
unsetarm32ENV
elif [ $ARCH == "arm64-v8a" ]
then
unsetarm64ENV
else
echo "$ARCH not support!"
return -1
fi
return $ret
}
check() {
echo "The test must be on an OpenHarmony device!"
# cd $builddir-${ARCH}-build/test
# ./testall
}
# 清理环境
cleanbuild(){
rm -rf ${PWD}/${builddir} ${PWD}/${builddir}-armeabi-v7a-build ${PWD}/${builddir}-arm64-v8a-build #${PWD}/$packagename
}
SHA512SUM
ad72a19d4c1d06e44338b37e1ab3f13220b8bcba0bf5504cff9cef6e5eb0681aa51ec473219c20398ce3614c1bc1f1ca2fc490bf99b50a8896fb5ee3efb27c5cmxml-3.3.1.tar.gz
末了
# 进入lycium目录编译minixml
cd /home/ohos/tpc_c_cplusplus/lycium
./build.sh minixml
编译Aliyun_oss_c_sdk
新建third-party库
cd /home/ohos/tpc_c_cplusplus/thirdparty && mkdir aliyun-oss-c-sdk && cd aliyun-oss-c-sdk
touch HPKBUILD
touch SHA512SUM
patch
须要对CMakeLists.txt打补丁
在tpc_c_cplusplus/thirdparty/aliyun-oss-c-sdk下新建oss_c_sdk_oh_pkg.patch,
touch oss_c_sdk_oh_pkg.patch
并粘贴
diff -rupN aliyun-oss-c-sdk-3.11.0/CMakeLists.txt aliyun-oss-c-sdk-3.11.0_patch/CMakeLists.txt
--- aliyun-oss-c-sdk-3.11.0/CMakeLists.txt 2023-03-20 21:49:10.000000000 +0800
+++ aliyun-oss-c-sdk-3.11.0/CMakeLists.txt 2023-05-10 14:51:49.579039952 +0800
@@ -117,4 +117,5 @@ include_directories(${APR_INCLUDE_DIR})
include_directories(${MINIXML_INCLUDE_DIR})
include_directories(${CURL_INCLUDE_DIR})
+link_libraries("-Wl,--allow-shlib-undefined" ${CURL_LIBRARY} ${APR_LIBRARY} ${APR_UTIL_LIBRARY} ${MINIXML_LIBRARY})
aux_source_directory(oss_c_sdk SRC_LIST)
打补丁动作写在HPKBUILD内,构建时会主动打
SHA512SUM
0a382d3ac90f7ae40d70e200b06c26a869e890634ab696eb9c557300682dedd30cf1f84ddde9f6fa3ce789f4320da14713aa3650f55c89964206f087f630c648aliyun-oss-c-sdk-3.11.0.tar.gz
8a253b847a8ba237b04192f3bcafe8cc20c29cba9d877ae6e9864e52c5662376607a0a64154e9a27e289b4058942ff1d4d97ea99c07eedd48455c748da15be9doss_c_sdk_oh_pkg.patch
若oss_c_sdk_oh_pkg.patch不匹配,则手动搞一下再换一下,参考上面
HPKBUILD
pkgname=aliyun-oss-c-sdk
pkgver=3.11.0
pkgrel=0
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."
url="http://oss.aliyun.com/"
archs=("arm64-v8a")
license=("Apache License 2.0")
depends=("curl" "apr" "apr-util" "minixml")
makedepends=()
source="https://github.com/aliyun/aliyun-oss-c-sdk/archive/refs/tags/3.11.0.tar.gz"
autounpack=true
downloadpackage=true
patchflag=true
buildtools="cmake"
builddir=aliyun-oss-c-sdk-3.11.0
packagename=aliyun-oss-c-sdk-3.11.0.tar.gz
patchflag=true
prepare() {
if $patchflag
then
cd $builddir
# 编译识别 OpenHarmony 系统
patch -p1 < `pwd`/../oss_c_sdk_oh_pkg.patch
# patch只需要打一次,关闭打patch
patchflag=false
cd $OLDPWD
fi
mkdir -p $builddir/$ARCH-build
}
build() {
cd $builddir
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
make -j4 -C $ARCH-build >> `pwd`/$ARCH-build/build.log 2>&1
ret=$?
cd $OLDPWD
return $ret
}
package() {
cd "$builddir"
make -C $ARCH-build install >> `pwd`/$ARCH-build/build.log 2>&1
cd $OLDPWD
}
check() {
echo "The test must be on an OpenHarmony device!"
}
# 清理环境
cleanbuild(){
rm -rf ${PWD}/$builddir #${PWD}/$packagename
}
末了
# 进入lycium目录编译aliyun-oss-c-sdk
cd /home/ohos/tpc_c_cplusplus/lycium
./build.sh aliyun-oss-c-sdk
产物
https://github.com/htliang128/tpc_c_cplusplus/tree/main/lycium/usr
参考
[*]tpc_c_cplusplus
[*]阿里云OSS官方文档
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]