当前位置: 首页 > news >正文

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 NDKexport ANDROID_NDK=/home/wyy/Android/android-ndk-r27cexport 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.0If 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  /  #安装numactlnumactl --hadware             / #检测numactlsudo 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"四个文件夹及文件:

http://www.lryc.cn/news/592056.html

相关文章:

  • UVC for USBCamera in Android - 篇二
  • 股指期货的杠杆比例一般是多少?
  • 【软件系统架构】系列七:系统性能——路由器性能深入解析
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - jieba库分词简介及使用
  • 短视频矩阵系统哪家好?全面解析与推荐
  • 短视频矩阵系统:从源头到开发的全面解析
  • 【unity实战】使用unity的Navigation+LineRenderer实现一个3D人物寻路提前指示预测移动轨迹的效果,并可以适配不同的地形
  • Charles 中文版介绍与使用指南 强大抓包工具助力 API 调试与网络优化
  • 网络编程(modbus,3握4挥)
  • 新书推介 | 吉林大学出版教材《汽车智能辅助驾驶系统技术》,国产仿真工具链GCKontrol-GCAir教学应用
  • mybatisdemo(黑马)
  • S7-1200 Profinet 的诊断功能
  • 嵌入式教育的云端革命:零边界实验室如何重塑未来工程师
  • 硬核电子工程:从硅片到系统的全栈实战指南—— 融合电路理论、嵌入式开发与PCB设计的工程艺术
  • 第三章自定义检视面板_创建自定义编辑器类_检测与应用修改(本章进度(2/9))
  • Xilinx Zynq:一款适用于软件定义无线电的现代片上系统
  • 深度学习之----对抗生成网络-pytorch-CycleGAN-and-pix2pix
  • IP协议深入理解
  • RustDesk 自建中继服务器教程(Mac mini)
  • 蓝松抠图的几大优点.
  • Vue中的refs字段使用记录
  • (数据结构)线性表(上):SeqList 顺序表
  • k8s:利用kubectl部署postgis:17-3.5
  • Kotlin序列
  • CloudFabric解决方案
  • 【怜渠客】简单实现手机云控Windows电脑锁屏
  • HTTP 性能优化:五条建议
  • 线程安全集合——ConcurrentHashMap
  • 微店平台商品详情接口技术实现指南
  • 前端埋坑之js console.log字符换行后 html没换行问题处理