交叉编译鸿蒙
交叉编译鸿蒙
该文主要介绍使用在 Ubuntu20 x86_64 上交叉编译代码为鸿蒙版本。
交叉编译鸿蒙
1. 交叉编译环境
开源鸿蒙6.1介绍:https://docs.openharmony.cn/pages/v6.1/zh-cn/OpenHarmony-Overview_zh.md
NDK下载
下载对应版本
配置编译环境,将压缩包放置到 Ubuntu20 系统目录 /home/august/Desktop/project
1
2
3
4
mkdir ./ohos-sdk-6.1
tar -xzvf ohos-sdk-windows_linux-public_6.1.0.31.tar.gz -C ./ohos-sdk-6.1
cd ./ohos-sdk-6.1
unzip native-linux-x64-6.1.0.31-Release.zip
创建 ohos.toolchain.sh 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
export OHOS_SDK=/home/august/Desktop/project/ohos-sdk-6.1/linux
export OHOS_NDK_HOME=$OHOS_SDK
export CC=$OHOS_NDK_HOME/native/llvm/bin/clang
export CXX=$OHOS_NDK_HOME/native/llvm/bin/clang++
export AR=$OHOS_NDK_HOME/native/llvm/bin/llvm-ar
export AS=$OHOS_NDK_HOME/native/llvm/bin/llvm-as
export LD=$OHOS_NDK_HOME/native/llvm/bin/ld.lld
export STRIP=$OHOS_NDK_HOME/native/llvm/bin/llvm-strip
export RANLIB=$OHOS_NDK_HOME/native/llvm/bin/llvm-ranlib
export OBJDUMP=$OHOS_NDK_HOME/native/llvm/bin/llvm-objdump
export OBJCOPY=$OHOS_NDK_HOME/native/llvm/bin/llvm-objcopy
export NM=$OHOS_NDK_HOME/native/llvm/bin/llvm-nm
export CFLAGS="-target aarch64-linux-ohos --sysroot=${OHOS_NDK_HOME}/native/sysroot -D__MUSL__"
export CXXFLAGS="-target aarch64-linux-ohos --sysroot=${OHOS_NDK_HOME}/native/sysroot -D__MUSL__"
2. 编译 openssl
参考1,以编译 openssl1.1.1w 为例
1
tar -xvf openssl-1.1.1w.tar.gz
2.1. 修改配置
该版本没有鸿蒙对应编译参数,需要对 Configurations/10-main.conf 做以下修改,可以添加到文件最后
1
2
3
4
5
6
7
8
9
10
11
12
13
14
"ohos-aarch64" => {
inherit_from => [ "linux-aarch64" ],
shared_extension => ".so"
},
"ohos-arm" => {
inherit_from => [ "linux-generic32" ],
asm_arch => 'armv4',
perlasm_scheme => "linux32",
shared_extension => ".so"
},
"ohos-x86_64" => {
inherit_from => [ "linux-x86_64" ],
shared_extension => ".so"
},
2.2. 编译
创建 build_openssl.sh,并且提升执行权限 chmod +x build_openssl.sh
1
2
3
4
5
6
7
8
9
10
source ./ohos.toolchain.sh
cd openssl-1.1.1w
chmod +x ./Configure
./Configure no-zlib ohos-aarch64 --prefix=$PWD/ohos_aarch64/
make -j 4
make install
cd ..
编译完成后可以在 openssl1.1.1w 目录中生成 ohos_aarch64 编译后的安装文件
3. 编译 boost
参考2,以编译 boost1.69.0 为例
1
tar -xvf boost_1_69_0.tar.gz
3.1. 生成 boost 编译工具
在 boost 目录下执行 bootstrap.sh,编译完成后生成编译工具 b2,以及要用到的 project-config.jam
3.2. 修改配置
1
vim project-config.jam
将配置文件内容清空,替换成如下配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
modules.poke : NO_BZIP2 : 1 ;
# 设置ndk的路径
OHOS_NDK = /home/august/Desktop/project/ohos-sdk-6.1/linux ;
# 设置编译参数
using clang : : $(OHOS_NDK)/native/llvm/bin/clang :
<archiver>$(OHOS_NDK)/native/llvm/bin/llvm-ar
<ranlib>$(OHOS_NDK)/native/llvm/bin/llvm-ranlib
<compileflags>--sysroot=$(OHOS_NDK)/native/sysroot
<compileflags>--target=aarch64-linux-ohos
# 出现找不到c++标准库头文件的错误,可以尝试加上这个搜索目录(现在暂时注释掉)
# <compileflags>-I$(OHOS_NDK)/native/llvm/include/libcxx-ohos/include/c++/v1/
<compileflags>-fdata-sections
<compileflags>-ffunction-sections
<compileflags>-funwind-tables
<compileflags>-fstack-protector-strong
<compileflags>-no-canonical-prefixes
<compileflags>-fno-addrsig
<compileflags>-Wa,--noexecstack
<compileflags>-D__MUSL__
;
删除了指定编译器版本,因为指定了编译器路径可以忽略版本,如果改为 using clang : ohos6.0 : $(OHOS_NDK)/native/llvm/bin/clang : 和在最后添加 project : default-build <toolset>clang-ohos6.0 ; 反而构建时报错
3.3. 修改 context 库编译配置
1
vim libs/context/build/Jamfile.v2
添加新的配置内容:
1
2
3
4
5
6
7
8
9
10
alias asm_sources
: asm/make_arm64_aapcs_elf_gas.S
asm/jump_arm64_aapcs_elf_gas.S
asm/ontop_arm64_aapcs_elf_gas.S
: <abi>sysv
<address-model>64
<architecture>arm
<binary-format>elf
<toolset>clang-ohos
;
3.4. 编译
1
./b2 -a --layout=system threadapi=pthread link=static threading=multi target-os=linux runtime-link=static stage --stagedir=ohos
如果需要完整的名称,可以修改为 --layout=versioned
参考
本文由作者按照 CC BY 4.0 进行授权




