AliOS编译三方库

文章目录

  • 1、官网教程
  • 2、编译NDK
    • 2.1 下载ndk
    • 2.2 编译环境准备
    • 2.3 安装ndk
  • 3 cmake交叉编译
    • 3.1 编译工具链
    • 3.2 编译三方库
  • 4 自带编译配置文件的交叉编译

1、官网教程

AliOS开发官网链接:AliOS开发者官网
AliOS编译三方库_第1张图片
应用开发下NDK开发有相关NDK开发介绍

2、编译NDK

2.1 下载ndk

AliOS编译三方库_第2张图片
首先,下载ndk

2.2 编译环境准备

  • 安装make
sudo apt install make
  • 安装nodejs
sudo apt install nodejs
# 查看nodejs是否安装成功,查看版本
node -v
  • 安装npm
sudo apt install npm
#查看npm是否安装成功,查看版本
npm -v

2.3 安装ndk

在这里插入图片描述首先将ndk拷贝到服务器中,这里准备将ndk解压到aliNDK中

tar -zxvf alios-ivi-ndk-linux*.tar.gz -C ./aliDNK/

使用tar命令解压,并指定解压目录
在这里插入图片描述
解压后目录结构如图所示,然后执行安装

# 导入环境变量
export NDK_ROOT=/home/xy/code/aliosndk/
# 安装yndk
sudo npm install -g ./ali-yndk-build-2.9.8.tgz
# 测试yndk
yndk-build --help
# 安装make toolchain
npm install -g $NDK_ROOT/toolchains/ali-make_standalone_toolchain*.tgz
# 测试make toolchain
make_standalone_toolchain -h

3 cmake交叉编译

以expat三方库为例

3.1 编译工具链

首先创建交叉编译工具链

make_standalone_toolchain \
  --arch arm64 \
  --stl gnustdc++ \
  --api 5 \
  --install-dir aarch64-toolchain \
  --force

其中api可以指定为对应的api级别。也可以通过–install-dir指定安装目录
在这里插入图片描述

export TOOLCHAIN_ROOT=`pwd`/aarch64-toolchain

导出环境变量,该环境变量会在交叉编译时使用

3.2 编译三方库

下载expat源码expat

# 解压源码
tar -zxvf expat-2.5.0.tar.gz -C .

在这里插入图片描述
源码解压后,存在CMakeLists.txt,可以通过cmake编译
编写配置文件yunos_ndk_aarch64.cmake

SET(CMAKE_SYSTEM_NAME Linux)
# specify the cross compiler
SET(CMAKE_C_COMPILER   $ENV{TOOLCHAIN_ROOT}/bin/aarch64-linux-gnueabi-gcc)
SET(CMAKE_CXX_COMPILER $ENV{TOOLCHAIN_ROOT}/bin/aarch64-linux-gnueabi-g++)
# where is the target environment
SET(CMAKE_FIND_ROOT_PATH  $ENV{TOOLCHAIN_ROOT}/sysroot)
# never search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
# set rpath after run `make all install`
SET(CMAKE_INSTALL_RPATH $ORIGIN)

这里的TOOLCHAIN_ROOT是上面导出的环境变量,指向了编译后的ndk路径
CMAKE_FIND_ROOT_PATH指示,编译依赖文件的根路径,可以设置成默认的。如果自己设置了sysroot,可以在这里面添加
配置文件完成之后可以执行文件编译。目前在代码根目录

mkdir out && cd out
cmake -DCMAKE_TOOLCHAIN_FILE=../yunos_ndk_aarch64.cmake -DCMAKE_INSTALL_PREFIX=./install ../
make && make install

CMAKE_INSTALL_PREFIX环境变量定义cmake执行make install命令时的安装路径。目前就是安装在out/install目录下的
编译后的文件如下:
AliOS编译三方库_第3张图片
包含可执行文件,动态库和头文件等

4 自带编译配置文件的交叉编译

这里以openssl为例
下载源码并解压

tar -zxvf openssl-3.2.0.tar.gz -C ./

修改crypto/getenv.c源码

char *ossl_safe_getenv(const char *name)
{
#ifndef YUNOS_NDK  // 当 YUNOS_NDK 有定义时,跳过 secure_getenv的使用
  #if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
  # if __GLIBC_PREREQ(2, 17)
  #  define SECURE_GETENV
      return secure_getenv(name);
  # endif
  #endif
#endif  // end of #ifndef YUNOS_NDK
#ifndef SECURE_GETENV
    if (OPENSSL_issetugid())
        return NULL;
    return getenv(name);
#endif
}

原因是 NDK glibc 并不支持 secure_getenv 这类 GNU 扩展的 API。所以需要在代码中避免使用这类 API。如果版本有差异,则只需要修改secure_getenv调用部分代码就可以
然后执行编译

TOOL=aarch64-linux-gnueabi && CFLAGS="-fPIC -DYUNOS_NDK"
mkdir out && cd out
../Configure  no-async linux-aarch64 shared --prefix=./install --openssldir=$INSTALL_DIR/openssl --cross-compile-prefix=${TOOLCHAIN_ROOT}/bin/${TOOL}- ${CFLAGS}
make && make install

执行完成之后,在out/install目录下生成相应文件
在这里插入图片描述

你可能感兴趣的:(#,Android底层开发,alios)