【Android 音视频开发打怪升级:FFmpeg音视频编解码篇,android高级面试题及答案

–extra-cflags=“-isysroot $SYSROOT”

-isysroot 的作用就是,把后面的路径设置为默认的头文件搜索路径,这时候,前面 sysroot 配置路径就不再作为 头文件 默认的搜索路径了,不过依然是 库文件 默认的搜索路径。

可以看到,这两个配置从某种程度上说是一样的:

–extra-cflags=“-I$SYSROOT/usr/include”

约等于

–extra-cflags=“-isysroot $SYSROOT”

  • extra-ldflags

这个和上面的 extra-cflags 作用是类似的,不过是用于配置额外的 库文件 搜索路径,如

–extra-ldflags=“-L$SYSROOT/usr/lib”

其中 -L 用于区分不同的路径

可以看到 extra-cflags extra-ldflags 结合起来可以替代 sysroot

  • cross-prefix

这个选项直译为 交叉编译前缀,指的是交叉编译工具的前缀。

这个选项经常和另外一个选项 cc 一起出现搭配使用。

这是什么意思呢?网上有的文章对于 cc 这个选项经常出现两种配置方式:

一种是只配置 cross-prefix ,没有配置 cc ,比如本文。

另一种是既配置 cross-prefix ,又配置 cc

比如:

–cc= T O O L C H A I N / b i n / a r m − l i n u x − a n d r o i d e a b i − g c c   − − c r o s s − p r e f i x = TOOLCHAIN/bin/arm-linux-androideabi-gcc \ --cross-prefix= TOOLCHAIN/bin/armlinuxandroideabigcc crossprefix=TOOLCHAIN/bin/arm-linux-androideabi- \

这是两种完全不同的配置方式,但是很神奇的是有时候他们都能成功编译,有时候又会出现找不到编译链工具的错误。

为了搞明白 cross-prefix cc 这两个选项的配置到底有什么影响,到底应该怎么使用这两个配置,我特地仔细的去看了 FFmpeg 根目录下的 configure 配置脚本,找到了一些蛛丝马迹。

分析 configure 配置脚本

注:以下分析基于ffmpeg-4.2.2版本,其他版本可能有所不同,掌握基本原理即可。

  • 获取用户配置选项

打开(注:不是双击运行)configure shell脚本,首先来看看 configure 是如何获取用户配置的编译选项的。

搜索 for opt do,可以找到以下代码

for opt do
optval=“KaTeX parse error: Expected '}', got '#' at position 5: {opt#̲*=}" case "opt” in
–extra-ldflags=)
add_ldflags $optval
;;
–extra-ldexeflags=
)
add_ldexeflags $optval
;;
–extra-ldsoflags=)
add_ldsoflags $optval
;;
–extra-ldlibflags=
)
warn “The --extra-ldlibflags option is only provided for compatibility and will be\n”
“removed in the future. Use --extra-ldsoflags instead.”
add_ldsoflags $optval
;;
–extra-libs=*)
add_extralibs $optval
;;
–disable-devices)
disable $INDEV_LIST O U T D E V L I S T ; ; − − e n a b l e − d e b u g = ∗ ) d e b u g l e v e l = " OUTDEV_LIST ;; --enable-debug=*) debuglevel=" OUTDEVLIST;;enabledebug=)debuglevel="optval"
;;

省略中间一些代码…

*)
optname=“KaTeX parse error: Expected '}', got 'EOF' at end of input: …%=*}" optname="{optname#–}”
optname= ( e c h o " (echo " (echo"optname" | sed ‘s/-/_/g’)
if is_in $optname $CMDLINE_SET; then
eval o p t n a m e = ′ optname=' optname=optval’
elif is_in $optname $CMDLINE_APPEND; then
append o p t n a m e " optname " optname"optval"
else
die_unknown $opt
fi
;;
esac
done

这个shell脚本的代码有很多特有的语法,也不用钻牛角尖,能大概看明白就可以了。

for循环的首行 通过分割 = 获取到用户设置的选项值 optval

下面除了一些特殊的选项,我们看看最后的通配符 *) ,这段代码的目的,其实就是把用户配置的选项和值关联起来。

比如 --cpu=armv7-a ,前面三行就是把 cpu 分割出来,赋值给 optname,再把 optval 赋值给 cpu,说白了就是初始化了 cpu 这个变量为 armv7-a

  • Android相关的配置

搜索 android 关键字,可以找到以下代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值