热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Ubuntundk编译libx264

《ffmpeg-androiddlopenfailed:library“libclang_rt.ubsan_standalone-aarch64-android.so“notfou

《ffmpeg-android dlopen failed: library “libclang_rt.ubsan_standalone-aarch64-android.so“ not found》
《nkd 编译ffmpeg错误: clang is unable to create an executable file. C compiler test failed.》

ndk编译libx264。(20210728)
一:环境:虚拟机Ubuntu+ndkandroid-ndk-r10e( Android NDK, Revision 10e (May 2015))
libx264

libx264自身的configure 默认使用gcc , 所以使用最新的ndk编译比较曲折,这里选用老板的ndkandroid-ndk-r10e
编译出来的库在源码根目录的 android/xxxabi下面

除了lib库,还有x264可执行程序,如果设备有root权限的,可以拷贝进去运行:(data目录)

二:编译流程:
在libx264源码根目录运行如下shell脚本
(将其中的ndk路径设置为下载解压好的ndk10e的路径,如果需要编译32bit的将下面--arm--注释的打开,--arm64--的注释掉)

#!/bin/bash
#NDK=/work/NDK/android-ndk-r18b
NDK=/work/NDK/android-ndk-r10efunction build_android
{
./configure \
--prefix=$PREFIX \
--enable-static \
--cross-prefix=$CROSS_PREFIX \
--sysroot=$SYSROOT \
--enable-pic \
--extra-cflags="-fPIC -fpic" \
--extra-ldflags=" -fPIE -pie" \
--host=aarch64-linux-android
if [ $? != 0 ];
then echo -e "\033[31mErr! get the detail message in config.log \033[0m" exit 0
fimake clean
make -j8
make install
}#------------arm64----------------
#SYSROOT=$NDK/sysroot //ndk18
SYSROOT=$NDK/platforms/android-21/arch-arm64
CROSS_PREFIX=$NDK/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-
PREFIX=$(pwd)/android/arm64-v8a##------------arm--------------
#SYSROOT=$NDK/platforms/android-21/arch-arm
#CROSS_PREFIX=$NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
#PREFIX=$(pwd)/android/armeabi-v7a#----其他的可以参考对应NDK下的目录路径即可build_android

三:
问题1
:编译libx264主要是ffmpeg需要,但是和编译ffmpeg不同,当前的libx264库提供的 configure竟然是没有配置使用clang 编译器,执行#./configure --help可以看到,可以设置--cross-prefix 交叉编译选项,没有-cc -cxx 的选项,添加上-cc -cxx的配置会报错,不添加的话, configure 里面默认使用的 CROSS_PREFIX-gcc  进行编译,最新的ndk (21) 已经抛弃了gcc, 没有gcc这个工具了,所以configure直接就会 cc test err,找不到编译器。
三种方法:
1.0 手动修改libx264 里面的configure, 让其像ffmpeg一样可以单独配置 -cc  -cxx。 (weinan)
2.0 在网上看到有些做法是,export CC=xx-clang  export CXX=xx-clang++  
     configure 脚本没有提供配置的接口,这里通过export 导出变量到当前shell 环境中,这种方法设置 编译器
3.0 既然libx264默认使用gcc, 就换一个支持gcc的ndk吧。
     这里碰到一个坑,下载了android-ndk-r18b  ,虽然这个ndk里面确实找到了 gcc, 但是这个交叉编译器工具链的gcc 有毛病,编译可以,连接就默认用到ubuntu 系统自身的 /usr/bin/ld 工具了,很是坑:
写个main空函数文件用它gcc 交叉编译一下都会报连接错误:

#android-ndk-r18b/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin$ aarch64-linux-android-gcc my_test.c
/usr/bin/ld: unrecognised emulation mode: aarch64linux
Supported emulations: elf_x86_64 elf32_x86_64 elf_i386 elf_iamcu i386linux elf_l1om elf_k1om i386pep i386pe
clang: error: linker command failed with exit code 1 (use -v to see invocation)

所以这里干脆找了个 老版本的ndk:
Android NDK, Revision 10e (May 2015)
编译OK

问题2:编译出来的 x264 无法在设备上运行:
在连接的时候加上参数  -fPIE -pie 即可。
问题3: 添加上 -pie 之后,编译报错,undefined reference to 'main'

这是编译动态库 时添加了参数-pie (位置无关码)造成的问题(本篇把--enable-shared 配置项去掉了,只编译静态库),本来加这个参数是给 编译x264可执行程序使用的。 去掉这个 -pie参数,即可,或者单独修改configure之后的makefile, 只对 编译x264可执行文件的编译项添加 -pie参数:

x264$(EXE): $(GENERATED) .depend $(OBJCLI) $(CLI_LIBX264)$(LD)$@ $(OBJCLI) $(CLI_LIBX264) $(LDFLAGSCLI) $(LDFLAGS) -pie

@u-xiancan:~/share_can/libx264/libx264_for_android/x264-master$ ./configure --help
Usage: ./configure [options]Help:-h, --help print this messageStandard options:--prefix=PREFIX install architecture-independent files in PREFIX[/usr/local]--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX[PREFIX]--bindir=DIR install binaries in DIR [EPREFIX/bin]--libdir=DIR install libs in DIR [EPREFIX/lib]--includedir=DIR install includes in DIR [PREFIX/include]--extra-asflags=EASFLAGS add EASFLAGS to ASFLAGS--extra-cflags=ECFLAGS add ECFLAGS to CFLAGS--extra-ldflags=ELDFLAGS add ELDFLAGS to LDFLAGS--extra-rcflags=ERCFLAGS add ERCFLAGS to RCFLAGSConfiguration options:--disable-cli disable cli--system-libx264 use system libx264 instead of internal--enable-shared build shared library--enable-static build static library--disable-bashcompletion disable installation of bash-completion script--enable-bashcompletion force installation of bash-completion script--bashcompletionsdir=DIR install bash-completion script in DIR [auto]--disable-opencl disable OpenCL features--disable-gpl disable GPL-only features--disable-thread disable multithreaded encoding--disable-win32thread disable win32threads (windows only)--disable-interlaced disable interlaced encoding support--bit-depth=BIT_DEPTH set output bit depth (8, 10, all) [all]--chroma-format=FORMAT output chroma format (400, 420, 422, 444, all) [all]Advanced options:--disable-asm disable platform-specific assembly optimizations--enable-lto enable link-time optimization--enable-debug add -g--enable-gprof add -pg--enable-strip add -s--enable-pic build position-independent codeCross-compilation:--host=HOST build programs to run on HOST--cross-prefix=PREFIX use PREFIX for compilation tools--sysroot=SYSROOT root of cross-build treeExternal library support:--disable-avs disable avisynth support--disable-swscale disable swscale support--disable-lavf disable libavformat support--disable-ffms disable ffmpegsource support--disable-gpac disable gpac support--disable-lsmash disable lsmash support

其他的一些配置选项:
--disable-asm            disable platform-specific assembly optimizations
默认开启,对于不同平台可以进行指令级别的专项优化
--enable-pic             build position-independent code
和上面添加的 -fpic 参数同样效果
问题4: configure 出错应该第一时间查看 config.log ,里面详细记录有日志,如果 出现如下错误:

cannot find crtbegin_dynamic.o: No such file or directory
......
cannot find -lc
......
cannot find -ldl

--sysroot 参数可能设置错误,在ndk目录中找一下这个 sysroot目录,或者直接找 包含 /usr/include  路径的目录,即交叉编译器的连接根目录。 


推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • PL2303HXD电路图(USB转UART)介绍及应用
    本文介绍了PL2303HXD电路图(USB转UART)的特性和应用,该电路图可以实现RS232和USB信号的转换,方便嵌入到手持设备中。PL2303HXD作为USB/RS232双向转换器,可以将USB数据转换为RS232信息流格式发送给外设,并将RS232外设的数据转换为USB数据格式传送回主机。通过利用USB块传输模式和自动流量控制,PL2303HXD能够实现更高的数据传输吞吐量比传统的UART端口。 ... [详细]
  • 本文概述了JNI的原理以及常用方法。JNI提供了一种Java字节码调用C/C++的解决方案,但引用类型不能直接在Native层使用,需要进行类型转化。多维数组(包括二维数组)都是引用类型,需要使用jobjectArray类型来存取其值。此外,由于Java支持函数重载,根据函数名无法找到对应的JNI函数,因此介绍了JNI函数签名信息的解决方案。 ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
  • Mono为何能跨平台
    概念JIT编译(JITcompilation),运行时需要代码时,将Microsoft中间语言(MSIL)转换为机器码的编译。CLR(CommonLa ... [详细]
author-avatar
吴小彬x
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有