Ubuntu ndk 编译libx264

2023-10-31

《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-r10e


function 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
fi

make 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 message

Standard 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 RCFLAGS

Configuration 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 code

Cross-compilation:
  --host=HOST              build programs to run on HOST
  --cross-prefix=PREFIX    use PREFIX for compilation tools
  --sysroot=SYSROOT        root of cross-build tree

External 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  路径的目录,即交叉编译器的连接根目录。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ubuntu ndk 编译libx264 的相关文章

  • Xamarin Android Webview Javascript

    我正在尝试通过 Xamarin for Android 创建一个移动应用程序 它有一个显示网站的 WebView 问题是正常按钮会触发 但 javascript 事件不会触发 我已经启用了 Javascript 但没有运气 如何在 Andr
  • Android Studio:XML 布局中的“包装在容器中”

    编辑 XML 布局文件时 Eclipse 有一项称为 包裹在容器中 的功能 重新格式化 gt Android gt 可让您选择一个或多个视图并在其周围包裹您选择的布局 Android Studio中有类似的东西吗 目前正在实施中 问题 69
  • 如何在android中显示保存在sdcard文件夹中的图像[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 当我正在显
  • fetchUuidsWithSdp 的奇怪 UUID 逆转

    我有一个在树莓派上运行的 python 蓝牙服务器 使用 PyBluez 我在服务器中使用的uuid是 8f86d132 4ab8 4c15 b8df 0b70cf10ea56 我正在打电话device fetchUuidsWithSdp
  • Recyclerview 动态部分不使用任何第三个库

    我想将标头添加到 recyclerview 我正在尝试使用来实现它 Override public int getItemViewType int position depends on your problem if position 0
  • 如何更改终端的默认目录?

    我想更改 Android Studio v2 2 2 终端的默认目录 当我打开终端时 它基于项目的目录 C 项目路径 我经常需要使用adb shell 所以我必须导航到 SDK 路径 平台工具 才能使用 adb 命令 是否可以更改终端的默认
  • Android:后台Activity可以执行代码吗?

    后台的活动是否被视为 正在运行 并且可以执行代码 还是处于挂起状态 他们暂停了 活动生命周期 http developer android com reference android app Activity html ActivityLi
  • 当 OnFocusChangeListener 应用于包装的 EditText 时,TextInputLayout 没有动画

    不能比标题说得更清楚了 我有一个由文本输入布局包裹的 EditText 我试图在 EditText 失去焦点时触发一个事件 但是 一旦应用了事件侦听器 TextInputLayout 就不再对文本进行动画处理 它只是位于 editText
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • Mipmap 与可绘制文件夹[重复]

    这个问题在这里已经有答案了 我正在使用 Android Studio 1 1 Preview 1 我注意到 当我创建一个新项目时 我得到以下层次结构 不同 DPI 的 Mipmap 文件夹 不再有不同 DPI 的可绘制文件夹 我应该将所有资
  • Android 中如何通过彩信发送图片?

    我正在开发多媒体应用程序 我正在通过相机捕获一张图像 并希望将该图像和文本发送到其他号码 但我不知道如何通过彩信发送图像 MMS 只是一个 http post 请求 您应该使用执行请求额外的网络功能 final ConnectivityMa
  • 我应该释放或重置 MediaPlayer 吗?

    我有自己的自定义适配器类 称为 WordAdapter 并且我正在使用媒体播放器 名为pronounce WordAdapter 类中的全局变量 我有不同的活动 其中每个列表项都有线性布局 名为linearLayout 我正在设置onCli
  • 如何在 Android 中从 WorkManager 取消工作?

    我已经保存了 WorkManagerUUID转换成String在领域数据库中 这是代码 Constraints constraints new Constraints Builder setRequiredNetworkType Netwo
  • 您使用什么物理 Android 设备进行测试?

    有什么好的推荐用于测试目的的物理 Android 设备吗 我正在苹果阵营寻找像 iPod touch 这样的设备 可以帮助 iOS 开发人员测试他们的东西 我知道有 Nexus One 但那东西相当昂贵 而且我并不真正关心手机的东西 而是可
  • 卡片视图 单击卡片移至新活动

    我是 Android 编程新手 正在研究卡片布局 我想知道如何使其可点击 android clickable true android foreground android attr selectableItemBackground 我的卡
  • 在命令行上卸载 Android SDK 的选定部分

    这与 卸载旧的 Android SDK 版本 https stackoverflow com questions 15182377 uninstall old android sdk versions 除非我想在无头 Linux CI 服务
  • 没有用于警告的设置器/字段 Firebase 数据库检索数据填充列表视图

    我只是想将 Firebase 数据库中的数据填充到我的列表视图中 日志显示正在检索数据 但适配器不会将值设置为列表中单个列表项中的文本 它只说 没有二传手 场地插入值 这让我觉得我的设置器没有正确制作 但 Android Studio 自动
  • 发布的 Android apk 出现错误“包文件未正确签名”

    我最近将我的应用程序上传到 Android 市场 但是由于错误 下载时它拒绝运行 包文件未正确签名 我首先使用 eclipse 发布了数据包 右键单击导出 创建密钥库然后发布 但它拒绝工作 然后我下载了 keytool 和 jarsigne
  • Git 实验分支还是单独的实验存储库?

    我正在开发一个 Android 应用程序 并且在整个开发周期中一直使用 Git 现在 我想构建并发布实验性功能 供人们尝试和安装 同时仍将原始的 稳定的应用程序安装在他们的设备上 现在 这意味着我需要使用不同的包名称 这会更改开发项目中的一
  • 有没有任何代码可以在android中设置壁纸而无需裁剪和缩放?

    我正在创建一个画廊应用程序 我的第一个应用程序 这是我的代码 Bitmap bmd BitmapFactory decodeStream is try getApplicationContext setWallpaper bmd catch

随机推荐

  • AUTOSAR-自旋锁(spinlock)与互斥锁

    AUTOSAR多核OS为实现核间资源互斥 保证数据一致性 设计了自旋锁机制 该机制适用于核间资源互斥 对于多核概念 需要一种新的机制来支持不同内核上任务的互斥 这种新机制不应在同一内核上的 TASK 之间使用 因为它没有意义 在这种情况下
  • Leetcode——118.杨辉三角

    杨辉三角 杨辉三角 是二项式系数在三角形中的一种几何排列 在欧洲 这个表叫做帕斯卡三角形 帕斯卡 1623 1662 是在1654年发现这一规律的 比杨辉要迟393年 比贾宪迟600年 杨辉三角是中国古代数学的杰出研究成果之一 它把二项式系
  • el-empty Empty 空状态 自定义图片 使用本地图片

    今天用到el empty组件 Empty 空状态 使用image属性导入自己本地图片不成功 后面发现问题如下 1 image属性要用动态绑定 即 image url 2 图片导入要用require url vue div class que
  • python 对数值各个数位上的单数操作

    如果对数值各个数位上的单数进行操作呢 比如 求解任意给定的某个数字的各个数位上的单数的平方和 如给定数字123 求解 思路就是通过循环使用 取余 和 取整 操作从该数字的个位开始往高位不断取值 代码如下 def calculate num
  • 可参考的MES系统软件

    MES生产管理系统 用的生产管理软件有 企业资源计划管理系统 ERP 制造企业生产过程执行管理系统 MES 生产设备和工位智能化联网管理系统 生产数据及设备状态信息采集分析管理系统 MDC 制造过程数据文档管理系统 工装及刀夹量具智能数据库
  • 常用的英文单词2000

    常用的英文单词 可以ctrl f来查找需要的单词 查找需要的前缀后缀引导的单词 1 a ei art 一 个 任何一 个 每一 个 2 I ai pron 我 3 ability biliti n 能力 本领 才能 才智 4 able ei
  • QT UDP简单的通信示例

    UDP user datagram protocol 即用户数据协议 是一个轻量级的 不可靠的 面向数据报的无连接协议 在qt中提供了QUdpSocket类来进行UDP数据报的发送和接收 在Pro中加入network模块 因为upd是无连接
  • Java中的重写(Override)

    从字面上看 重写就是 重新写一遍的意思 其实就是在子类中把父类本身有的方法重新写一遍 子类继承 了父类原有的方法 但有时子类并不想原封不动的继承父类中的某个方法 所以在方法名 参数列 表 返回类型 除过子类中方法的返回值是父类中方法返回值的
  • 万字长文总结Android多进程,面试心得体会

    前言 跳槽容易 但想拿大厂的offer可不那么容易 很多小伙伴一直叨叨要跳槽 大大小小的公司面试了很多 但却很难拿到一个满意的offer 要么package太低 要么就是面试被虐 经过多次面试失利之后 方能明白什么叫基础不牢 地动山摇 面试
  • 二、读取编码器数值实现电机测速—1 、配置串口通信;

    读取编码器数值实现电机测速 电机系列 二 读取编码器数值实现电机测速 1 配置串口通信 usart h usart c main c 2 配置编码器 电机系列 二 读取编码器数值实现电机测速 1 配置串口通信 usart h ifndef
  • ElasticSearch第一讲 Docker-compose 单机部署Elasticsearch kibana esHead与配置认证证书设置密码

    准备工作 docker安装 docker compose安装配置 如果还有没安装docker的可以参考我的docker docker compose安装配置 本次讲解的是安装ES 7 13 3 现在目前官网给出的最新ES版本已经是8 x了
  • 基于Vue实现动态组织结构图

    最近一个项目里有个前端绘制家谱图的需求 大概是下面这个样子 基于Vue实现动态组织结构图 点击节点会弹出操作菜单 实现增删改查等操作 查阅网上资料发现 现有案例基本都是基于orgchart这个jQuery插件实现的 我们的项目是基于Vue的
  • mapbox-gl 点位编辑功能

    文章目录 前言 方式一 借助 Marker 添加自定义icon 添加POI图层 绑定对应事件 基于Marker交互 创建自定义Marker 编辑 创建POI 方式二 采用 mapbox gl draw 插件 总结 前言 矢量在线编辑是gis
  • Matlab的double函数

    将一个数用浮点数的形式表示 比如在复数表示中 举例如下 1 double 1 i 2 i 1 4 1 2 得到 ans 0 9943 0 4733i 2 double cosh 1 2 sinh 1 2 i 1 得到 ans 0 8868
  • 基于vue的长列表虚拟滚动插件

    基于vue的长列表虚拟滚动插件 1 背景 一个长列表 Web 页面 如果需要展示成千上万条数据 那么页面中就会有数万甚至数十万的HTML节点 会巨大的消耗浏览器性能 进而给用户造成非常不友好的体验 主要体现在以下几个方面 页面等待时间极长
  • 图像边缘锯齿及处理方法

    形态学处理 二值图像 处理方法有多种 比如 smoothing edges of a binary image 前置滤波 后置滤波 基于光线追踪的抗锯齿 插值滤波 由采样引起的边界失真处理 如双线性滤波 及相关改进的插值滤波方法 改进的滤波
  • C++的函数重载

    每个现象后面都隐藏一个本质 关键在于我们是否去挖掘 写在前面 函数重载的重要性不言而明 但是你知道C 中函数重载是如何实现的呢 虽然本文谈的是C 中函数重载的实现 但我想其它语言也是类似的 这个可以分解为下面两个问题 1 声明 定义重载函数
  • (记录)JAVA-Swing 简单的登录注册 使用记事本来保存账号密码

    更新时间 2022年10月1日12 30 22 java代码规范中 验证码不能使用伪随机数 需要使用强随机数 效果图 提示信息放在通知台输出 账户和密码都是通过正则表达式来校验的 验证码是通过花瓣画出来生成图片的 点击验证码可以切换图片 j
  • SpringBoot 集成Dubbo 提示:java.lang.NoClassDefFoundError: org/apache/curator/RetryPolicy

    今天搭建SpringBoot 集成Dubbo 提示如下错误信息 java lang NoClassDefFoundError org apache curator RetryPolicy 原因 缺少curator框架依赖 pom xml 文
  • Ubuntu ndk 编译libx264

    ffmpeg android dlopen failed library libclang rt ubsan standalone aarch64 android so not found nkd 编译ffmpeg错误 clang is u