我正在研究使用GStreamer 0.10.36的嵌入式系统的软件。我的目标是保持软件在闪存空间方面尽可能小,所以我想静态链接我需要的GStreamer插件。根据核心参考手册:
“有一些选项可以将插件静态链接到应用程序甚至使用 没有插件存储库的GStreamer,在这种情况下gst_plugin_load() 可能需要将插件带入内存。 “
不幸的是,我不清楚我需要做些什么来将插件带入内存,以便后续调用gst_element_factory_make()
成功完成。
我正在做以下事情:
--enable-static
和--disable-registry
设置构建GStreamer。gst_element_factory_make()
创建元素现在我只为一个插件(tcpclientsink)执行此操作,作为一个实验。我必须编辑该插件的Makefile以删除--disable-static
语句以获取要构建的libgsttcp.a文件。我认为图书馆很好,但我不确定是否有一个很好的方法来验证它。 gst-inspect
似乎不适用于静态库。
注意:如果我调用load_gst_plugin(/path/to/libgsttcp.a)
,由于ELF标头无效,GStreamer无法加载插件。
如何加载静态链接的GStreamer库?
答案 0 :(得分:3)
我制作了一个应用程序,其中所有插件都在应用程序内编译(因此它是自包含的)...也许这是另一个选项,或者你真的需要链接到库吗?
我得到了我用来编译共享库中插件的常用代码(plugin.c和plugin.h)。我添加了一个包含静态注册码的额外包装器头
static gboolean myplugin_init(GstPlugin * plugin)
{
gboolean ret;
gst_controller_init(NULL, NULL);
GST_DEBUG_CATEGORY_STATIC (gst_myplugin_debug);
GST_DEBUG_CATEGORY_INIT(gst_myplugin_debug, "myplugin", 0, "description");
ret = gst_element_register(plugin, "myplugin", GST_RANK_NONE, GST_TYPE_MECIMOTION);
return ret;
}
void gstmyplugins_register_static()
{
gst_plugin_register_static(
GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"myplugin",
"description",
myplugin_init,
"0.0.1",
"LGPL",
"myplugins",
"GStreamer",
"http://gstreamer.net/");
gst_plugin_register_static(
...
}
然后在我的应用程序的代码中,我称之为注册:
gstmyplugins_register_static();
然后继续
gst_element_factory_make("myplugin", NULL);
希望这会有所帮助。
答案 1 :(得分:1)
在GStreamer开发人员的帮助下,我找到了答案....不要使用版本0.10.36。 :)
基本上,在以后的版本中添加/修复了构建静态插件库的能力。为了让它在0.10.36中工作,我不得不将端口更改从GStreamer SDK和GStreamer 1.x支持到0.10.36。事情仍然是一项正在进行中的工作,但我能够建立libgstcoreelements.
和静态链接。如果我还没有构建0.10.36的修改版本,我可能会使用SDK。
<强>更新强>
我创建了我正在使用的所有库的静态版本。我的GStreamer库现在是0.10.36,SDK和1.2.2之间的混合体,但它可以工作。我不会为任何人推荐这个解决方案。使用SDK或版本1.x。