本次交叉编译是在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。
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
unzip android-ndk-r27c-linux.zip
2、修改android-ndk-r27c-linux权限:
sudo chmod 777 -R android-ndk-r27c
3、获取NDK存放的路径:
在NDK的文件夹中找到ndk-build存放的路径,可以cd到NDK文件夹下pwd后获取:
4、NDK环境变量的配置:
1)、使用如下命令行在.bashrc中添加NDK的路径:
sudo gedit ~/.bashrc
2)、在.bashrc的文件末尾加入3中获取的ndk路径,保存并退出:
#Android NDK
export ANDROID_NDK=/home/wyy/Android/android-ndk-r27c
export PATH=$PATH:$ANDROID_NDK
3)、使用如下命令行更新环境变量的配置:
source ~/.bashrc
4)、测试NDK的配置:
命令行使用如下测试ndk配置是否成功:
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编辑。加入如下的代码:
#Android NDK TOOLCHANS
export NDK_TOOLCHANS=$ANDROID_NDK/toolchains/llvm/prebuilt/linux-x86_64/bin
export PATH=$PATH:$NDK_TOOLCHANS
保存退出,并更新.bashrc的配置:
source ~/.bashrc
2、定位crosscompile.cmake文件:
在.../x265/x265_4.1/build/aarch64-linux的文件夹下,找到crosscompile.cmake文件。如下操作:
3、修改crosscompile.cmake文件内容:
sudo gedit crosscompile.cmake
1)、找到crosscompile.cmake中的如下代码
set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
2)、把上面的代码替换成如下的配置
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库:
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:
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编译:
编译报错:
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"四个文件夹及文件: