gpt4 book ai didi

c - gstreamer 插件库未链接到 opencv 共享对象库 - Ubuntu 上的 "undefined symbol"

转载 作者:太空宇宙 更新时间:2023-11-03 23:03:09 29 4
gpt4 key购买 nike

我已经尝试了整个周末 - 周六/周日和周一花了几个小时,但无济于事。我正在关注 gstreamer 插件作者指南 http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/section-boiler-project-stamp.html .在尝试 gstreamer 插件程序之前,我已经安装了 gstreamer-0.10(sudo apt-get 安装方法)和 OpenCV 2.4。我使用默认前缀 (/usr/local/lib/gstreamer-0.10./configure 期间进行插件测试,然后再 sudo make && sudo make install)

我设法生成了样板代码。现在我添加了一个像

这样的 cvcreateImage
static GstFlowReturn
gst_cvtestfilter_chain (GstPad * pad, GstBuffer * buf)
{
Gstcvtestfilter *filter;
GstBuffer *outbuf;
IplImage* cvImage = cvCreateImage(cvSize(cvwidth,cvheight),cvdepth, cvchannels);
.
.
}

如果 cvImage 行被注释,一切都会顺利进行。所有测试都正常。如果我不评论该行,针对 OpenCV 的链接会因某种原因而失败。

我修改了 makefile.am 以在 src 目录中添加 OpenCV 标志作为

 # Note: plugindir is set in configure

##############################################################################
# TODO: change libgstcvtestfilter.la to something else, e.g. libmysomething.la #
##############################################################################
plugin_LTLIBRARIES = libgstcvtestfilter.la

##############################################################################
# TODO: for the next set of variables, name the prefix if you named the .la, #
# e.g. libmysomething.la => libmysomething_la_SOURCES #
# libmysomething_la_CFLAGS #
# libmysomething_la_LIBADD #
# libmysomething_la_LDFLAGS #
##############################################################################

# sources used to compile this plug-in
libgstcvtestfilter_la_SOURCES = gstcvtestfilter.c gstcvtestfilter.h

# compiler and linker flags used to compile this plugin, set in configure.ac
libgstcvtestfilter_la_CFLAGS = $(GST_CFLAGS) $(OPENCV_CFLAGS)
libgstcvtestfilter_la_LIBADD = $(GST_LIBS) $(OPENCV_LIBS)
libgstcvtestfilter_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstcvtestfilter_la_LIBTOOLFLAGS = --tag=disable-static

# headers we need but don't want installed
noinst_HEADERS = gstcvtestfilter.h

我还修改了父目录下的configure.ac

 dnl *** opencv ***
translit(dnm, m, l) AM_CONDITIONAL(USE_OPENCV, true)

dnl we specify a max. version too because we set CV_NO_BACKWARD_COMPATIBILITY
dnl and don't want the build to break when a new opencv version comes out.
dnl Need to adjust this upwards once we know that our code compiles fine with
dnl a new version and the no-backward-compatibility define. (There doesn't
dnl seem to be a switch to suppress the warnings the cvcompat.h header
dnl causes.)
PKG_CHECK_MODULES(OPENCV, opencv >= 2.0.0 opencv <= 3.1.0 , [
AC_PROG_CXX
AC_LANG_CPLUSPLUS
OLD_CPPFLAGS=$CPPFLAGS
CPPFLAGS=$OPENCV_CFLAGS
AC_CHECK_HEADER(highgui.h, HAVE_HIGHGUI="yes", HAVE_HIGHGUI="no")
AC_CHECK_HEADER(cvaux.h, HAVE_CVAUX="yes", HAVE_CVAUX="no")
CPPFLAGS=$OLD_CPPFLAGS
AC_LANG_C
if test "x$HAVE_HIGHGUI" = "xno"; then
AC_MSG_RESULT(highgui.h could not be found.)
HAVE_OPENCV="no"
elif test "x$HAVE_CVAUX" = "xno"; then
AC_MSG_RESULT(cvaux.h could not be found.)
HAVE_OPENCV="no"
else
HAVE_OPENCV="yes"
AC_SUBST(OPENCV_CFLAGS)
AC_SUBST(OPENCV_LIBS)
fi
], [
HAVE_OPENCV="no"
AC_MSG_RESULT(no)
])

编译正常 - 没有错误。

现在,当我在管道中运行插件时,我收到此消息

(gst-plugin-scanner:6396): GStreamer-WARNING **: Failed to load plugin '/usr/local/lib/gstreamer-0.10/libgstcvtestfilter.so': /usr/local/lib/gstreamer-0.10/libgstcvtestfilter.so: undefined symbol: cvCreateImage

很明显,我位于 /usr/local/lib 的 opencv 没有正确链接。

sudo gedit/etc/bash.bashrc 包含

#Added By me
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH

#Added By me
PATH=$PATH:/opt/Xilinx/13.4/ISE_DS/ISE/bin/lin
export PATH

GST_PLUGIN_PATH=$GST_PLUGIN_PATH:/usr/local/lib/gstreamer-0.10
export GST_PLUGIN_PATH

sudo gedit/etc/ld.so.conf.d/opencv.conf 包含

/usr/local/lib

sudo gedit/etc/ld.so.conf.d/gst.conf 包含

/usr/local/lib/gstreamer-0.10

sudo ldconfig -v

sudo gedit ~/.bashrc 包含

export LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib/gstreamer-0.10

ldd/usr/local/lib/gstreamer-0.10/libgstcvtestfilter.so 没有 opencv 依赖,这很奇怪

linux-gate.so.1 =>  (0xb77b6000)
libgstreamer-0.10.so.0 => /usr/lib/i386-linux-gnu/libgstreamer-0.10.so.0 (0xb76b0000)
libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0xb7661000)
libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0xb7567000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb754c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb73a7000)
libgmodule-2.0.so.0 => /usr/lib/i386-linux-gnu/libgmodule-2.0.so.0 (0xb73a2000)
libxml2.so.2 => /usr/lib/i386-linux-gnu/libxml2.so.2 (0xb7255000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb7228000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb721f000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb721a000)
libffi.so.6 => /usr/lib/i386-linux-gnu/libffi.so.6 (0xb7213000)
libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0xb71d7000)
/lib/ld-linux.so.2 (0xb77b7000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb71c0000)

我的操作系统是 32 位 12.04 Ubuntu。如果有人能指出我正确的方向,我将不胜感激。谢谢。

更新:(2012 年 6 月 29 日)

根据 OpenCV 的经验,如果有人感兴趣,我为 OpenGL 修改了 configure.ac

AC_CHECK_HEADER(
GL/gl.h,
AC_DEFINE(
[HAVE_OPENGL],
[],
Define to 1 if you have the <GL/gl.h> header file.
)
OPENGL_LIBS="$X_LIBS -lGL -lGLU -lpthread -lglut -lGLEW"
opengl=yes,
AC_MSG_WARN([*** no GL/gl.h -- opengl and SDL support disabled])
)
AC_SUBST(OPENGL_CFLAGS)
AC_SUBST(OPENGL_LIBS)


dnl AC_ARG_WITH(
dnl opengl-cflags,
dnl [ --with-opengl-cflags=PATH Specify OpenGL cflags],
dnl OPENGL_CFLAGS="$withval", OPENGL_CFLAGS="")
dnl AC_ARG_WITH(
dnl opengl-libs,
dnl [ --with-opengl-libs=PATH Specify OpenGL libs (default is -lGL -lGLU -lpthread)],
dnl OPENGL_LIBS="$withval", OPENGL_LIBS="-lGL -lGLU -lpthread -lglut -lGLEW")
dnl AC_SUBST(OPENGL_CFLAGS)
dnl AC_SUBST(OPENGL_LIBS)

最佳答案

我知道这个问题与 GStreamer 0.1 版有关,但我在从源代码编译时遇到了 GStreamer v1.4.5 的类似错误,而 OpenCV 2.4.10.1 也是从源代码编译的。

在我的例子中,运行 gst-inspect-1.0 会打印以下消息:

(gst-plugin-scanner:7485): GStreamer-WARNING **: Failed to load plugin '/usr/local/lib/gstreamer-1.0/libgstopencv.so': /usr/local/lib/gstreamer-1.0/libgstopencv.so: undefined symbol: cvCloneImage......Total count: 196 plugins (1 blacklist entry not shown), 1109 features

我的解决方案受到 here 的解决方案 2 的启发。 , 但不是更改源文件,而是将 OPENCV_LIBS 环境变量传递给 autogen.sh。

OPENCV_LIBS="-lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann -lopencv_gpu -lopencv_legacy -lopencv_nonfree -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_videostab" ./autogen.sh

您可能需要根据使用的构建配置调整库。

这是我在 pkg-config --libs opencv 中的输出:

/usr/local/lib/libopencv_calib3d.so /usr/local/lib/libopencv_contrib.so /usr/local/lib/libopencv_core.so /usr/local/lib/libopencv_features2d.so /usr/local/lib/libopencv_flann.so /usr/local/lib/libopencv_gpu.so /usr/local/lib/libopencv_highgui.so /usr/local/lib/libopencv_imgproc.so /usr/local/lib/libopencv_legacy.so /usr/local/lib/libopencv_ml.so /usr/local/lib/libopencv_nonfree.so /usr/local/lib/libopencv_objdetect.so /usr/local/lib/libopencv_ocl.so /usr/local/lib/libopencv_photo.so /usr/local/lib/libopencv_stitching.so /usr/local/lib/libopencv_superres.so /usr/local/lib/libopencv_ts.a /usr/local/lib/libopencv_video.so /usr/local/lib/libopencv_videostab.so -lrt -lpthread -lm -ldl

关于c - gstreamer 插件库未链接到 opencv 共享对象库 - Ubuntu 上的 "undefined symbol",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11094953/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com