2017-03-01 319 views
0

编译和构建一个简单的OpenCV程序后,我遇到了这个问题,当我跑的二进制文件:opencv错误:检测到GTK + 2.x符号。在同一过程中使用GTK + 2.x和GTK + 3不支持

Gtk-ERROR **: GTK+ 2.x symbols detected. Using GTK+ 2.x and GTK+ 3 in the same process is not supported

而这些结果运行pkg-config

pkg-config --libs gtk+-2.0 

给我

-lgtk-x11-2.0 -lgdk-x11-2.0 -lpangocairo-1.0 -latk-1.0 -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lpangoft2-1.0 -lpango-1.0 -lgobject-2.0 -lglib-2.0 -lfontconfig -lfreetype

pkg-config --libs gtk+-3.0 

给我

-lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0

回答

1

你的库可能是你所用的连接使用GTK 3.0。您是否试图追查这些库中每个版本正在使用哪个版本?也许他们都在使用版本2,而你自己正在使用版本3.当你连接或运行时,你是否会遇到这个错误? ldd将显示libs的运行时使用情况。

举个例子,我想知道如果我的代码,它使用GTK库或我使用它使用GTK库的版本3的图书馆之一的版本3。

所以首先我要运行LDD,看看哪个库我的exe文件在运行时使用。

$ ldd /usr/bin/gkrellm | head 
    linux-vdso.so.1 => (0x00007ffe57d03000) 
    libgtk-x11-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0 (0x00007f5c88b55000) 
    libgdk-x11-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgdk-x11-2.0.so.0 (0x00007f5c888a0000) 
    libgdk_pixbuf-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0 (0x00007f5c8867d000) 
    libpango-1.0.so.0 => /usr/lib/x86_64-linux-gnu/libpango-1.0.so.0 (0x00007f5c88431000) 

我已经截断了输出使用头,但在这里它显示的exe是使用gtk版本2 lib。但是,这是因为我的EXE链接反对它,或者因为我使用的库中有一个使用它?

让我们尝试libpango库。

$ readelf -d /usr/lib/x86_64-linux-gnu/libpango-1.0.so.0 | grep library 
0x0000000000000001 (NEEDED)    Shared library: [libgobject-2.0.so.0] 
0x0000000000000001 (NEEDED)    Shared library: [libglib-2.0.so.0] 
0x0000000000000001 (NEEDED)    Shared library: [libthai.so.0] 
0x0000000000000001 (NEEDED)    Shared library: [libm.so.6] 
0x0000000000000001 (NEEDED)    Shared library: [libpthread.so.0] 
0x0000000000000001 (NEEDED)    Shared library: [libc.so.6] 

如果我重复这个过程中,我会看到,在这种情况下libgtk不使用任何subsquent林达等的GTK LIB是由源的gkrellm本身要求收回。

在你的情况,我怀疑你有使用一个版本,但您的代码使用的是不同的版本库。

+0

我在运行时出现此错误。 Idd向我显示'/usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0:'和'/usr/lib/x86_64-linux-gnu/libgtk-3.so.0:'。我是linux新手,不知道这是什么意思。你可以说得更详细点吗?谢谢! ' –

+0

我阐述了我的答案,展示了如何使用ldd和readelf来查找exes和libs的主要和次要依赖关系。 – netskink