你的库可能是你所用的连接使用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本身要求收回。
在你的情况,我怀疑你有使用一个版本,但您的代码使用的是不同的版本库。
我在运行时出现此错误。 Idd向我显示'/usr/lib/x86_64-linux-gnu/libgtk-x11-2.0.so.0:'和'/usr/lib/x86_64-linux-gnu/libgtk-3.so.0:'。我是linux新手,不知道这是什么意思。你可以说得更详细点吗?谢谢! ' –
我阐述了我的答案,展示了如何使用ldd和readelf来查找exes和libs的主要和次要依赖关系。 – netskink