赞
踩
近期项目要开始做鸿蒙版本,有一部分依赖native的代码也需要迁移,某个native模块依赖openssl,需要在鸿蒙下重新编译openssl才行。一开始找了很多相关文档都没有得到方法,无奈只能自己凭经验慢慢试,最后还是成功了。
https://gitee.com/openharmony/docs/tree/master/zh-cn/release-notes#openharmony-release-notes
需要单独下载一份sdk,因为ide里面下载的sdk里面的ndk是不全的,缺少sysroot
上面的下载地址其实包含了编译三方库的教程,但是只有基于Cmake的方式,而且非常简陋,并没有提供一个真实的三方库编译教程,而实际开发中通常要复杂很多,需要编译的库往往有许多配置,还有一些子依赖,比较难以处理。另外有些库压根没有提供Cmake编译的方式,比如OpenSSL。如果库支持的话使用cmake编译相对简单一些,可以使用cmake-gui或者ide。
大多数库都会提供一个配置脚本(./Configure)让使用者自定义进行编译,通常只需要配置好一些必要参数,必要工具的路径就可以比较轻松的完成,但是现在主流库肯定是没有鸿蒙支持的,所以需要自己额外配置的东西很多,接下来以编译OpenSSL为例。
先定义一个比较通用的配置脚本build_config.sh,方便以后编译其他库也能用,鸿蒙的编译器好像不像android那样需要区分api和架构,全都在llvm目录下,直接指定就可以了
另外还需要指定目标平台target、sysroot、cflags这些,我在文档里面没有找到,按照惯例找到了sdk里面的ohos.toolchain.cmake文件,参考这个文件进行了定义
比较麻烦的是编译openssl时需要指定的架构,openssl支持的架构配置在下图这些文件里面给了定义,但是没有鸿蒙的支持,那就只能选用linux的,linux-armv4、linux-aarch64这些。
build_config.sh
- #NDK路径
- export OHOS_NATIVE_HOME=/Users/admin/Downloads/ohos-sdk/darwin/native
- export PATH=$OHOS_NATIVE_HOME/llvm/bin:$PATH
- #cpu架构
- if [ "$#" -lt 1 ]; then
- THE_ARCH=armv7
- else
- THE_ARCH=$(tr [A-Z] [a-z] <<< "$1")
- fi
-
- BASE_FLAGS="--sysroot=$OHOS_NATIVE_HOME/sysroot -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -fno-addrsig -Wa,--noexecstack -fPIC"
-
- #根据不同架构配置环境变量
- case "$THE_ARCH" in
- armv7a|armeabi-v7a)
- OHOS_ARCH="armeabi-v7a"
- OHOS_TARGET="arm-linux-ohos"
- OPENSSL_ARCH="linux-armv4"
- FF_EXTRA_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS -march=armv7a"
- FF_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS -march=armv7a"
- ;;
- armv8|armv8a|aarch64|arm64|arm64-v8a)
- OHOS_ARCH="arm64"
- OHOS_TARGET="aarch64-linux-ohos"
- OPENSSL_ARCH="linux-aarch64"
- FF_EXTRA_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS"
- FF_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS"
- ;;
- x86_64|x64)
- OHOS_ARCH="x86_64"
- OHOS_TARGET="x86_64-linux-ohos"
- OPENSSL_ARCH="linux-x86_64"
- FF_EXTRA_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS"
- FF_CFLAGS="--target=$OHOS_TARGET $BASE_FLAGS"
- ;;
- *)
- echo "ERROR: Unknown architecture $1"
- [ "$0" = "$BASH_SOURCE" ] && exit 1 || return 1
- ;;
- esac
-
- # 工具链
- TOOLCHAIN=$OHOS_NATIVE_HOME/llvm
-
- # 交叉编译库搜索路径
- SYS_ROOT=$OHOS_NATIVE_HOME/sysroot
- # 编译器
- CC=$TOOLCHAIN/bin/clang
- CXX=$TOOLCHAIN/bin/clang++
- # 链接器,将目标文件(包括静态库和共享库)合并成一个可执行文件或共享库
- LD=$TOOLCHAIN/bin/ld-lld
- # 汇编器,将汇编语言代码转换为机器代码
- AS=$TOOLCHAIN/bin/llvm-as
- # 静态库管理工具,用于创建、修改和提取静态库中的目标文件
- AR=$TOOLCHAIN/bin/llvm-ar
- # 符号表工具,用于显示目标文件中的符号(函数、变量等)信息
- NM=$TOOLCHAIN/bin/llvm-nm
- # 静态库索引工具,用于创建和更新静态库的索引,以提高库的访问速度
- RANLIB=$TOOLCHAIN/bin/llvm-ranlib
- # 剥离工具,用于从可执行文件或共享库中去除调试信息,从而减小文件大小
- STRIP=$TOOLCHAIN/bin/llvm-strip
接下来就比较简单了,再定义一个执行编译的脚本build_openssl.sh,可选的编译参数在configure文件里面,可以按需要配置
build_openssl.sh
- #!/bin/bash
- ARCH=$1
- source build_config.sh $ARCH
- LIBS_DIR=$(cd `dirname $0`; pwd)/libs/openssl
- PREFIX=$LIBS_DIR/$OHOS_ARCH
-
- echo "PREFIX"=$PREFIX
-
- export CC="$CC"
- export CXX="$CXX"
- export CXXFLAGS=$FF_EXTRA_CFLAGS
- export CFLAGS=$FF_CFLAGS
- export AR="$AR"
- export LD="$LD"
- export AS="$AS"
- export NM="$NM"
- export RANLIB="$RANLIB"
- export STRIP="$STRIP"
- export LDFLAGS="--rtlib=compiler-rt -fuse-ld=lld"
-
- ./Configure $OPENSSL_ARCH \
- --prefix=$PREFIX \
- no-engine \
- no-asm \
- no-threads \
- shared
-
- make clean
- make -j2
- make install
-
- cd ..
还有两个比较坑的点
最后把脚本文件放到openssl目录下执行编译就可以了,也可以再写一个脚本方便一次性编译所有架构
- for arch in armeabi-v7a arm64-v8a
- do
- bash build_openssl.sh $arch
- done
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。