使用自动工具链接 gstreamer 插件中的外部库

Posted

技术标签:

【中文标题】使用自动工具链接 gstreamer 插件中的外部库【英文标题】:Linking against external libraries in gstreamer plugin using autotools 【发布时间】:2015-09-28 14:47:53 【问题描述】:

我使用 gstreamer 插件编写者指南 (http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/chapter-building-boiler.html) 中引用的样板模板编写了一个 gstreamer 插件。我首先构建了没有完整实现链功能的插件(基本上是一个空插件,将数据从源传递到接收器而没有任何更改)。

我现在正在实现链函数以对缓冲区中的数据执行基本过滤。过滤使用外部锐化库(我已在 gstreamer 之外成功使用)。使用 autotools 构建时没有错误,但是使用新插件创建管道时,出现未定义符号错误

(gst-plugin-scanner:6512): GStreamer-WARNING **: Failed to load plugin '/usr/local/lib/gstreamer-1.0/libgstsharpening.so': /usr/local/lib/gstreamer-1.0/libgstsharpening.so: undefined symbol: InitializeSharpeningModule

诚然,我对自动工具非常陌生,我相信我的问题出在这个过程的某个地方,但我不知道在哪里。可以在此处找到正在使用的外部锐化库

/public/gstreamer_pipeline/lib/libsharpening.so

我编辑了插件 Makefile.am 在我的插件的 src 目录中找到

/public/gstreamer_pipeline/src/gst-sharpening/src

编辑后的Makefile.am的内容是

plugin_LTLIBRARIES = libgstsharpening.la

libgstsharpening_la_SOURCES = gstsharpening.c gstsharpening.h

libgstsharpening_la_CFLAGS = $(GST_CFLAGS) -I/public/gstreamer_pipeline/include
libgstsharpening_la_LIBADD = $(GST_LIBS) -lsharpening
libgstsharpening_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -L/public/gstreamer_pipeline/lib
libgstsharpening_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)

noinst_HEADERS = gstsharpening.h

在从主程序创建管道或使用命令行创建管道的情况下发生未定义符号错误

gst-launch-1.0 fakesrc ! sharpening ! fakesink

在新创建的插件库上运行ldd(不修改LD_LIBRARY_PATH)的输出是

ldd /usr/local/lib/gstreamer-1.0/libgstsharpening.so
    linux-vdso.so.1 =>  (0x00007fff17bc0000)
    libgstbase-1.0.so.0 => /usr/local/lib/libgstbase-1.0.so.0 (0x00007f3c51778000)
    libgstcontroller-1.0.so.0 => /usr/local/lib/libgstcontroller-1.0.so.0 (0x00007f3c51568000)
    libgstreamer-1.0.so.0 => /usr/local/lib/libgstreamer-1.0.so.0 (0x00007f3c51250000)
    libgmodule-2.0.so.0 => /usr/local/lib/libgmodule-2.0.so.0 (0x00007f3c5104d000)
    libm.so.6 => /lib64/libm.so.6 (0x00007f3c50db0000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f3c50bac000)
    libgobject-2.0.so.0 => /usr/local/lib/libgobject-2.0.so.0 (0x00007f3c5095f000)
    libffi.so.6 => /usr/local/lib/../lib64/libffi.so.6 (0x00007f3c50755000)
    libglib-2.0.so.0 => /usr/local/lib/libglib-2.0.so.0 (0x00007f3c50420000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f3c50203000)
    librt.so.1 => /lib64/librt.so.1 (0x00007f3c4fffa000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f3c4fc67000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003406c00000)

configure.log 输出http://pastie.org/10450341

make 和 make install 的输出http://pastie.org/10450352

【问题讨论】:

那么符号InitializeSharpeningModule在哪里使用?它是在哪里定义的(出口商)? 它用于我正在尝试构建的新插件的chain()函数中,并在/public/gstreamer_pipeline/lib/libsharpening.so中定义 您是否设置了LD_LIBRARY_PATH(或其他方式)以使运行时链接器在/public/gstreamer_pipeline/lib/ 中查找库? 我为运行时链接正确设置了 LD_LIBRARY_PATH,是的。 【参考方案1】:

运行时链接器/加载器很可能在非标准路径 (/public/gstreamer_pipeline/lib/) 中找不到辅助库 (libsharpening.so)。

(您告诉 automake 在哪里为构建过程中的链接 步骤查找该库;这并不意味着 运行时链接器 看起来相同地点)。

有多种方法可以解决这个问题:

将库安装在运行时链接器会查找它的位置,例如/usr/local/lib/(这是好方法

将运行时链接器配置为在非标准路径中永久查找库,方法是将其添加到 /etc/ld.so.config(或者 - 如果您的系统支持 - 将其添加到新文件 /etc/ld.so.conf.d/gstreamer_pipeline.conf

通过LD_LIBRARY_PATH 环境变量告诉运行时链接器使用附加路径进行库解析。

例如

LD_LIBRARY_PATH=/public/gstreamer_pipeline/lib/ gst-launch-1.0 \
          fakesrc ! sharpening ! fakesink

【讨论】:

我有 LD_LIBRARY_PATH 指向非标准库位置。当我在我构建的插件共享对象上运行 ldd 时,它甚至没有将库 /public/gstreamer_pipeline/lib/libsharpening.so 显示为已链接。 请将ldd libgstsharpening.so 的输出(没有任何LD_LIBRARY_PATH)添加到您的问题。如果您可以将构建的日志文件发布到某些 pastie 也会有所帮助 问题已更新,感谢您的建议。

以上是关于使用自动工具链接 gstreamer 插件中的外部库的主要内容,如果未能解决你的问题,请参考以下文章

带有 DataTables 的表中的外部链接(jQuery 插件)

Linux之gstreamer视频编解码测试指令

控制 gstreamer 源插件的输出速率

如何从 gstreamer 中的源请求更多缓冲区?

gstreamer移植qnx:交叉编译qnx版本的gstreamer插件库

gstreamer:交错 2 个音频 - 链接错误