下载 x264 源码
|
|
编写脚本文件
查看文件目录
查看支持的命令
|
|
部分命令说明
Standard options | 描述 |
---|---|
–prefix=PREFIX | 指定生成的文件存放的位置 |
–exec-prefix=EPREFIX | |
–bindir=DIR | |
–libdir=DIR | [PREFIX/lib] |
–includedir=DIR | [PREFIX/include] |
–extra-asflags=EASFLAGS | |
–extra-cflags=ECFLAGS | 本质是设置 CFLAGS 变量(默认 gcc、clang 会读取 CFLAGS 变量) |
–extra-ldflags=ELDFLAGS | |
–extra-rcflags=ERCFLAGS |
Configuration options | 描述 |
---|---|
–disable-cli | cli: 命令行工具 |
–system-libx264 | |
–enable-shared | 动态库,so 文件 |
–enable-static | 静态库,a 文件 |
–disable-bashcompletion | |
–enable-bashcompletion | |
–bashcompletionsdir=DIR | |
–disable-opencl | |
–disable-gpl | |
–disable-thread | |
–disable-win32thread | |
–disable-interlaced | |
–bit-depth=BIT_DEPTH | |
–chroma-format=FORMAT |
Advanced options | 描述 |
---|---|
–disable-asm | |
–enable-lto | |
–enable-debug | 本质是在 CFLAGS 添加 -g |
–enable-gprof | 本质是在 CFLAGS 添加 -pg |
–enable-strip | 本质是在 CFLAGS 添加 -s |
–enable-pic | *本质是在 CFLAGS 添加 -fPIC,Android 需要 |
Cross-compilation | 描述 |
---|---|
–host=HOST | *运行的平台 |
–cross-prefix=PREFIX | *设置库文件的路径前缀 |
–sysroot=SYSROOT | *指定库与头文件的搜索路径的根目录(默认会使用 Linux 的文件,Android 需要改为使用 NDK 中的文件) |
External library support | 描述 |
---|---|
–disable-avs | |
–disable-swscale | |
–disable-lavf | |
–disable-ffms | |
–disable-gpac | |
–disable-lsmash |
编写脚本文件
1、创建文件
- CC: 指定编译 C 的编译器,需要以环境变量使用
- CXX: 指定编译 C++ 的编译器,需要以环境变量使用
|
|
添加 Android 项目需要的 CFLAGS 的技巧
当 configure 不支持某个参数时,需要主动在 CFLAGS 中添加。
1、新建 Android 的 C++ 项目
2、build release 版本,生成 build.ninja、rules.ninja
3、使用 build.ninja 中的 FLAGS
|
|
4、使用 rules.ninja 中的参数
|
|
调整路径,修改参数,去掉重复的参数:
对脚本中的变量进行抽取,方便修改
|
|
编译生成 Android 所需的库
给脚本文件设置权限
|
|
执行脚本文件
|
|
编译可能会遇到缺少 NASM 库的情况,下载安装比较新的版本就可以了。
可以看到 CFLAGS 中的不识别的参数会被忽略:
然后展示基本信息:
然后是详细过程,最后生成文件:
编译完成后生成文件
编译结果查看 log
/x264/config.log
编译 x86 版本时报错:clang: error: unknown argument: ‘-mpreferred-stack-boundary=6’
原因貌似是当 clang 遇到不识别的参数时会报 error,是 clang 的处理机制问题。参见Issue 475183: clang: does not support -mpreferred-stack-boundary=2。
解决办法有 2 个:
1、去掉不识别的参数。
2、使用更高版本的修复了这个问题的 clang。
由于我没找到这个参数是在哪加的,且不清楚去掉后会有什么影响,所以我采用第 2 种方法解决这个问题,最终在 i686-linux-android24-clang 版本解决了问题。