在Yocto Morty中编译Gstreamer 1.12.2遇错,求解决方案
在Yocto Morty中编译GStreamer 1.12.2的问题解析与解决方案
错误原因分析
你遇到的这些问题本质上是Yocto版本API兼容性差异导致的:
- Yocto Morty(2.2.1)使用的BitBake版本不支持
getVar()不带expand参数的调用,这个参数要求是在Pyro(2.3)版本才加入的强制要求; bb.utils.filter也是在Pyro及以后版本才新增的工具函数,Morty的bb.utils模块里没有这个方法;- 文件冲突则是因为高版本GStreamer的插件拆分规则和Morty官方默认的1.8.3版本不同,导致base和bad插件包出现了文件重叠。
你的疑问解答与可行方案
1. 是否无法在Yocto Morty中部署GStreamer 1.12.2及以上版本?
不是完全不行,但需要做大量的手动适配工作——因为高版本GStreamer的recipe是针对Pyro+版本的Yocto编写的,依赖了Morty不具备的BitBake API和工具函数。
2. 可行的解决办法
这里提供几个不同复杂度的方案,你可以根据自己的需求选择:
方案一:手动适配现有meta-gstreamer1.0层的recipe
针对你遇到的错误逐个修复:
- 修复
getVar()参数错误:遍历所有报错的recipe文件,把所有getVar("XXX")的调用改成getVar("XXX", True)(需要展开变量时)或者getVar("XXX", False)(不需要展开时)。比如在gstreamer1.0-omx_1.12.2.bb和gstreamer1.0-plugins-bad_1.12.2.bb里修改相关Python代码块; - 替换
bb.utils.filter:Morty里没有这个函数,你可以用列表推导式手动实现过滤逻辑,比如把bb.utils.filter(pattern, mylist)改成[item for item in mylist if pattern in item],或者使用Morty中可用的oe.utils.filter(如果你的BSP里包含这个工具函数); - 解决文件冲突:针对
libgstrawparse.la/.so的冲突,查看gstreamer1.0-plugins-base_1.12.2.bb和gstreamer1.0-plugins-bad_1.12.2.bb的FILES定义,确定这个文件应该属于哪个插件包,然后在另一个recipe的FILES里移除该文件的路径。比如如果这个文件属于base包,就在bad包的recipe里添加FILES_${PN}_remove = "${libdir}/gstreamer-1.0/libgstrawparse.*"。
方案二:寻找社区适配的Morty版GStreamer 1.12.x meta层
有些社区可能已经针对Morty做了GStreamer高版本的适配,你可以搜索有没有专门适配Morty的meta-gstreamer分支,直接使用该分支的recipe可以省去大部分适配工作。
方案三:移植高版本GStreamer补丁到官方Morty recipe
如果你只需要GStreamer 1.12.x的部分新功能,可以尝试把GStreamer 1.12.2的代码补丁移植到Morty官方的gstreamer1.0_1.8.3.bb等recipe中,这种方式工作量较大,但可以最小化对现有BSP的影响。
3. 是否必须升级到Yocto Pyro及以上版本?
如果不想花费时间做手动适配,升级到Pyro或更高版本是最省心的方案:
- 高版本Yocto官方已经支持GStreamer 1.12.x,API完全匹配,不会出现你遇到的这些兼容性错误;
- 但需要注意:升级Yocto版本可能会带来Variscite BSP的适配问题,你需要确认Variscite是否提供了对应Pyro版本的BSP支持(比如你使用的
variscite-bsp-platform有没有Pyro分支)。
内容的提问来源于stack exchange,提问作者user8257918
相关产品推荐
相关产品推荐

