文章

交叉编译鸿蒙

交叉编译鸿蒙

该文主要介绍使用在 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 进行授权