使用autotools

时间:2015-09-28 14:47:53

标签: c gstreamer autotools automake libtool

我使用gstreamer插件编写器指南(http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/chapter-building-boiler.html)中的样板模板refrenced编写了一个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

我无疑是autotools的新手,我相信我的问题在于那个过程中的某个地方,但我无法弄清楚在哪里。正在使用的外部锐化库可以在这里找到

/public/gstreamer_pipeline/lib/libsharpening.so

我编辑了插件中的插件Makefile.am,插件是我的插件

/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输出{{​​3}}

make和make install [{3}}

的输出

1 个答案:

答案 0 :(得分:1)

运行时链接程序/加载程序很可能无法在非标准路径(it)中找到辅助库(libsharpening.so)。

(您告诉automake在构建过程中为链接步骤查找该库的位置;这并不意味着运行时链接程序会看到相同的内容位)。

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

  • 将库安装在运行时链接程序将查找的位置,例如/public/gstreamer_pipeline/lib/(这是好方法

    • 将运行时链接程序配置为永久查找非标准路径中的库,方法是将其添加到/usr/local/lib/(或 - 如果您的系统支持它 - 将其添加到新文件/etc/ld.so.config
  • 通过/etc/ld.so.conf.d/gstreamer_pipeline.conf环境变量告诉运行时链接器使用额外的路径进行库解析。

e.g。

LD_LIBRARY_PATH