2012-07-30 26 views
0

我有一個使用OpenCV的插件,它在Kubuntu上完美工作。現在我試圖運行在CentOS的代碼,但是當我運行的管道,我得到:gstreamer插件庫無法鏈接到opencv共享對象庫 - CentOS上的「未定義符號」

$ gst-launch videotestsrc ! opencvelement ! ximagesink 
WARNING: erroneous pipeline: no element "opencvelement" 

當我在Kubuntu的運行LDD,我得到:

$ ldd .libs/libOPENCVELEMENT.so 
    linux-gate.so.1 => (0x0060f000) 
    libgstbase-0.10.so.0 => /usr/lib/libgstbase-0.10.so.0 (0x00a74000) 
    libgstreamer-0.10.so.0 => /usr/lib/libgstreamer-0.10.so.0 (0x00474000) 
    libgobject-2.0.so.0 => /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 (0x006a2000) 
    libglib-2.0.so.0 => /lib/i386-linux-gnu/libglib-2.0.so.0 (0x00110000) 
    libopencv_core.so.2.3 => /usr/local/lib/libopencv_core.so.2.3 (0x00730000) 
    libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0x00209000) 
    libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x002f4000) 
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00acd000) 
    libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x0031e000) 
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x0033c000) 
    libgthread-2.0.so.0 => /usr/lib/i386-linux-gnu/libgthread-2.0.so.0 (0x00357000) 
    libgmodule-2.0.so.0 => /usr/lib/i386-linux-gnu/libgmodule-2.0.so.0 (0x0035d000) 
    libxml2.so.2 => /usr/lib/libxml2.so.2 (0x00c9c000) 
    librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x00362000) 
    libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x0036b000) 
    libffi.so.6 => /usr/lib/i386-linux-gnu/libffi.so.6 (0x00370000) 
    libpcre.so.3 => /lib/i386-linux-gnu/libpcre.so.3 (0x00e52000) 
    libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0x00377000) 
    /lib/ld-linux.so.2 (0x00a10000) 

但是當我上運行CentOS的,我沒有看到的OpenCV

$ ldd .libs/libOPENCVELEMENT.so 
    linux-vdso.so.1 => (0x00007fff7a1fd000) 
    libgstvideo-0.10.so.0 => /usr/lib64/libgstvideo-0.10.so.0 (0x00002ba0ac9b7000) 
    libgstcontroller-0.10.so.0 => /usr/lib64/libgstcontroller-0.10.so.0 (0x00002ba0acbc4000) 
    libgstbase-0.10.so.0 => /usr/lib64/libgstbase-0.10.so.0 (0x00002ba0acdeb000) 
    libgstreamer-0.10.so.0 => /usr/lib64/libgstreamer-0.10.so.0 (0x00002ba0ad03c000) 
    libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0 (0x00002ba0ad326000) 
    libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x00002ba0ad569000) 
    libgthread-2.0.so.0 => /lib64/libgthread-2.0.so.0 (0x00002ba0ad76c000) 
    librt.so.1 => /lib64/librt.so.1 (0x00002ba0ad970000) 
    libxml2.so.2 => /usr/lib64/libxml2.so.2 (0x00002ba0adb7a000) 
    libz.so.1 => /lib64/libz.so.1 (0x00002ba0adeb7000) 
    libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00002ba0ae0cb000) 
    libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00002ba0ae3a8000) 
    libm.so.6 => /lib64/libm.so.6 (0x00002ba0ae6a8000) 
    libc.so.6 => /lib64/libc.so.6 (0x00002ba0ae92b000) 
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002ba0aec83000) 
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00002ba0aee91000) 
    libdl.so.2 => /lib64/libdl.so.2 (0x00002ba0af0ac000) 
    /lib64/ld-linux-x86-64.so.2 (0x0000003f6c800000) 

這裏是我的makefile.am,這既是操作系統在同一

plugin_LTLIBRARIES = libOPENCVELEMENT.la 

# Plugin source files: 
libOPENCVELEMENT_la_SOURCES = opencv_chain.c opencv_chain.h datasetup.h 
libOPENCVELEMENT_la_CFLAGS = \ 
    $(GST_PLUGINS_BASE_CFLAGS) \ 
    $(GST_CFLAGS) \ 
    $(OPENCV_CFLAGS) 

libOPENCVELEMENT_la_CXXFLAGS = \ 
    $(GST_PLUGINS_BASE_CFLAGS) \ 
    $(GST_CFLAGS) \ 
    $(OPENCV_CFLAGS) 

libOPENCVELEMENT_la_LIBADD = \ 
    $(GST_PLUGINS_BASE_LIBS) \ 
    $(GST_LIBS) \ 
    $(OPENCV_LIBS) \ 
    -lopencv_core \ 
    -lopencv_highgui 

libOPENCVELEMENT_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) 
libOPENCVELEMENT_la_LIBTOOLFLAGS = --tag=disable-static 

如果您需要更多信息,請告知我。任何幫助將不勝感激。謝謝。

+0

當我這樣做的.so文件的GST檢查我得到 '$ GST-檢查/usr/lib64/gstreamer-0.10/libopencvtest.so (gst-inspect-0.10:5378):GStreamer-WARNING **:未能加載插件'/usr/lib64/gstreamer-0.10/libopencvtest.so': /usr/lib64/gstreamer-0.10/libopencvtest.so:未定義的符號:_ZN2cv3Mat10deallocateEv 無法加載插件文件:打開模塊失敗:/usr/lib64/gstreamer-0.10/libopencvtest.so:未定義的符號:_ZN2cv3Mat10deallocateEv' – 2012-07-31 18:10:40

+0

我去進入/ usr/lib64/pkgconfig並修改opencv.pc來明確擁有所有庫IES。然後我運行了'pkg-config --libs opencv'。當我在插件上做一個ldd時,它顯示了所有的庫,但是當我運行gst-inspect – 2012-08-01 13:46:18

回答

0

我可以通過轉到/ usr/lib64/pkgconfig並修改opencv.pc來明確擁有所有庫來解決此問題。我也不得不插件從/usr/lib/gstreamer-0.10移動到/usr/lib64/gstreamer-0.10

0

您是否還在centos上安裝了所有opencv開發文件。運行a:

grep "OPENVC_" Makefile 

檢查Make變量包含的內容。你也可以通過C++ filt管道鏈接器(未定義符號)輸出來查看真實的函數名稱而不是錯誤的名稱。

+0

'$ grep「OPENCV_」Makefile OPENCV_CFLAGS = -I/usr/include時仍然沒有這樣的元素或插件/ OpenCV的 OPENCV_LIBS = -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_ts -lopencv_video -lopencv_videostab $(OPENCV_CFLAGS) $(OPENCV_CFLAGS) $(OPENCV_LIBS) ' – 2012-08-01 13:40:22

+0

C++ filt返回cv :: Mat :: deallocate() – 2012-08-01 13:41:06