Ubuntu系统下交叉编译Android的X265库

本次交叉编译是在Ubuntu20.4上进行的。

一、下载X265源码:

1、下载X265源码包

x265源码下载地址:Bitbucket

在这里选择x265_4.1版本的

2、解压缩x265_4.1.tar.gz

创建一个x265的文件夹放置下载x265_4.1.tar.gz,并解压缩x265_4.1.tar.gz。

bash 复制代码
    tar -xvf x265_4.1.tar.gz x265_4.1/

二、下载NDK:

1、下载解压:

在NDK 下载 NDK 下载 | Android NDK | Android Developers下载Liunx平台的NDK。

在这里下载的是android-ndk-r27c-linux.zip版本的。

解压android-ndk-r27c-linux.zip

bash 复制代码
        unzip android-ndk-r27c-linux.zip 

2、修改android-ndk-r27c-linux权限:

bash 复制代码
    sudo chmod 777 -R android-ndk-r27c

3、获取NDK存放的路径:

在NDK的文件夹中找到ndk-build存放的路径,可以cd到NDK文件夹下pwd后获取:

4、NDK环境变量的配置:

1)、使用如下命令行在.bashrc中添加NDK的路径:

bash 复制代码
    sudo gedit ~/.bashrc

2)、在.bashrc的文件末尾加入3中获取的ndk路径,保存并退出:

bash 复制代码
    #Android NDK
    export ANDROID_NDK=/home/wyy/Android/android-ndk-r27c
    export PATH=$PATH:$ANDROID_NDK

3)、使用如下命令行更新环境变量的配置:

bash 复制代码
    source ~/.bashrc

4)、测试NDK的配置:

命令行使用如下测试ndk配置是否成功:

bash 复制代码
    ndk-build -v

三、X265源码配置及编译:

在x265_4.1/build/readme.txt中对构建做了具体描述,而在这里的目的是交叉编译出Android平台的构建文件。下面截图部分是关于aarch64交叉编译的描述:

复制代码
= Build Instructions for cross-compilation for Arm AArch64 Targets =

Cross compilation of x265 for AArch64 targets is possible on x86 platforms by
passing a toolchain file when running CMake to configure the project:

* cmake -DCMAKE_TOOLCHAIN_FILE=<path-to-toolchain-file>

Toolchain files for AArch64 cross-compilation exist in the /build directory.
These specify a default cross-compiler to use; however this can be overridden
by setting the CMAKE_C_COMPILER and CMAKE_CXX_COMPILER CMake variables when
running CMake to configure the project. For example:

* cmake -DCMAKE_C_COMPILER=aarch64-linux-gnu-gcc -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++

The following AArch64 ISA features are turned on by default when cross-compiling:

* Neon DotProd, mandatory from Armv8.4
* Neon I8MM, mandatory from Armv8.6
* SVE, mandatory from Armv9.0
* SVE2, mandatory from Armv9.0

If the target platform does not support Armv8.4 Neon DotProd instructions, the
ENABLE_NEON_DOTPROD CMake option should be set to OFF:

由上可知在编译X265前要设置一些工具链的设置,接下来就一些具体的操作步骤:

1、配置NDK的交叉编译的工具链的环境变量:

把ndk交叉编译工具链的路径配置到环境变量中,命令行sudo gedit ~/.bashrc编辑。加入如下的代码:

bash 复制代码
#Android NDK TOOLCHANS
export NDK_TOOLCHANS=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin
export PATH=$PATH:$NDK_TOOLCHANS

保存退出,并更新.bashrc的配置:

bash 复制代码
    source ~/.bashrc

2、定位crosscompile.cmake文件:

在.../x265/x265_4.1/build/aarch64-linux的文件夹下,找到crosscompile.cmake文件。如下操作:

3、修改crosscompile.cmake文件内容:

bash 复制代码
    sudo gedit crosscompile.cmake

1)、找到crosscompile.cmake中的如下代码

bash 复制代码
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)

2)、把上面的代码替换成如下的配置

bash 复制代码
set(CMAKE_C_COMPILER aarch64-linux-android24-clang)
set(CMAKE_CXX_COMPILER aarch64-linux-android24-clang++)

3)、交叉编译工具链的替换:

以上的原则是因为:原X265中的编译链使用linux中的gnu-gcc编译工具链,现在把它设置成Android NDK的编译工具链,从而用于交叉编译

4、运行make-Makefiles.bash

1)、运行../x265/build/aarch64-linux文件夹下的make-Makefiles.bash:

运行中的日志如下解释a:

如下中框选的日志就是NDK的交叉编译工具链的环境变量,在X265文件夹下的crosscompile.cmake文件中CMAKE_C_COMPILER 和CMAKE_CXX_COMPILER的映射。

运行中的日志如下解释b:

"Could NOT find NUMA (missing: NUMA_ROOT_DIR NUMA_INCLUDE_DIR NUMA_LIBRARY)",说明系统中没有安装NUMA库的软件。

安装NUMA库:

bash 复制代码
    sudo apt-get update /
    sudo apt-get install numactl  /  #安装numactl
    numactl --hadware             / #检测numactl
    sudo apt-get install libnuma-dev /#安装libnuma-dev

安装后再重新运行make-Makefiles.bash,报错日志提示会减少为:"Could NOT find NUMA (missing: NUMA_LIBRARY) "。

运行中的日志如下解释c:

**"Could NOT find nasm (missing: NASM_EXECUTABLE)",**说明系统中没有安装nasm库的软件。

安装nasm:

bash 复制代码
    sudo apt-get update    /
    sudo apt-get install nasm    /
    nasm -v

安装nasm之后,重新运行make-Makefiles.bash。日志里面能打印出nasm版本了:

2)、接下来会编译一会儿弹出如下选项界面:

3)、修改选界面配置:

在修改界面配置前,在../x265的文件夹下创建一个android_build用于存放编译成的文件。

  • 把CMAKE_INSTALL_PREFIX这项改为/home/wyy/x265/android_build(按向下键定位到该项,再按回车键,即可按照vi方式编辑路径);
  • 把ENABLE_ASSEMBLY这项改为OFF(按向下键定位到该项,再按回车键,即可把ON改为OFF)
  • 把ENABLE_CLI这项改为OFF(按向下键定位到该项,再按回车键,即可把ON改为OFF)

上述的配置完成之后,按c键开始配置,再按e键退出配置,然后按g键开始生成。

4)、make编译:

进入../x265/build/aarch64-linux进行make编译:

编译报错:
bash 复制代码
d.lld: error: unable to find library -lpthread
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [CMakeFiles/x265-shared.dir/build.make:184: libx265.so.215] Error 1
make[1]: *** [CMakeFiles/Makefile2:176: CMakeFiles/x265-shared.dir/all] Error 2
make: *** [Makefile:136: all] Error 2
问题修复:

进入x265_4.1源码目录 ../build/aarch64-linux/CMakeFiles/x265-shared.dir,进行如下修改

  • a、**修改该目录的link.txt,把文件中的所有"libx265.so.215"替换为"libx265.so"。同时删除文件末尾的" -lpthread "。**如下图所示:
  • b、如在同目录存在relink.txt的话,修改说明同link.txt。

  • c、修改同目录下面的build.make,把该文件中的所有"libx265.so.215"替换为"libx265.so",把所有的"libx265.so"替换为"libx265.so.215"。注意A和B互换名称的时候,可以设定第三个名称C,比如先把A替换为C,接着B替换为A,然后C替换为B

经过以上a、b、c步骤的修复,重新make编译后,没有报错了:

5)、make install编译:

则在" 3)、修改选界面配置"中设置的"编译文件放置的位置"------"/home/wyy/x265/android_build"里面生成两个"include"和"lib"文件夹,就是需要的的交叉编译的结果。

四、编译结果的展示:

1、include:

包含"x265.h"及"x265_config.h"两个头文件。

2、lib:

包含"pkgconfig"、"libx265.a"、"libx265.so"、"libx265.so.215"四个文件夹及文件:

相关推荐
wdfk_prog13 分钟前
[Linux]学习笔记系列 -- hashtable
linux·笔记·学习
每日出拳老爷子28 分钟前
【远程协助】内网 IT 运维远程协助系统的最小可用架构
运维·服务器·远程工作·流媒体·视音频
weixin_4624462333 分钟前
使用 Puppeteer 设置 Cookies 并实现自动化分页操作:前端实战教程
运维·前端·自动化
oMcLin37 分钟前
如何在 Ubuntu 22.10 上通过 Kubernetes 和 Helm 管理微服务应用,简化跨平台电商平台的自动化部署?
ubuntu·微服务·kubernetes
CheungChunChiu1 小时前
Linux 内核动态打印机制详解
android·linux·服务器·前端·ubuntu
oMcLin2 小时前
如何在Ubuntu 20.04上配置并优化容器化的SaaS应用平台,实现弹性伸缩与跨区域分布?
ubuntu·sass
BlueBirdssh2 小时前
linux 内核通过 dts 设备树 配置pcie 控制器 各种参数和中断等, 那freeRTOS 是通过直接设置PCIe寄存器吗
linux
小目标一个亿2 小时前
Windows平台Nginx配置web账号密码验证
linux·前端·nginx
实战项目3 小时前
软件测试自动化框架的设计与实现
运维·自动化
Aotman_3 小时前
Element-UI Message Box弹窗 使用$confirm方法自定义模版内容,修改默认样式
linux·运维·前端