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。 

    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_COMPILERCMAKE_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"四个文件夹及文件:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值