如何自动链接到共享库的依赖项

时间:2012-11-12 16:51:13

标签: c++ qt linker g++ ld

我正在尝试在Linux上构建一个小型Qt(C ++)GUI应用程序,但它无法构建大量链接器错误,抱怨缺少我链接的Qt库的依赖关系。我在Qt库上使用了ldd来验证库确实存在 - 而且它们是。

我的问题似乎与此主题中的讨论有关: Linking dependencies of a shared library 虽然该线程帮助我确定了我的确切问题,但似乎该线程的结论是我的应用程序应该链接!

使用以下命令编译应用程序:

g++ -m64 -Wl,-O1 -o Executable some-object.o some-other-object.o -lQtCore -lQtGui -lQtXml -L/usr/lib64 -L/usr/X11R6/lib64 -lpthread

运行此命令会生成以下形式的警告,并且链接最终会因未定义的引用错误而失败(对于“缺失”库中定义的符号):

.../ld: warning: libglib-2.0.so.0, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link)
.../ld: warning: libpng14.so.14, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link)
.../ld: warning: libz.so.1, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link)
.../ld: warning: libfreetype.so.6, needed by /usr/lib64/libQtGui.so, not found (try using -rpath or -rpath-link)

等等(总共有18个无法找到的依赖项。)

如果我去并明确地添加-lglib,-lpng14,-lz -lfreetype等,我可以编译它,但正如我所提到的,有18个依赖项 - 我宁愿不这样做。我似乎也不应该这样做。

我在我的笔记本电脑上编译了同一个项目,它使用完全相同的Linux Distro(openSuse 12.2),没有任何麻烦。所有库,包括Qt,都是从发行版存储库安装的。

我认为这可能是我的openSuse安装上的某种设置问题,但我不知道从哪里开始寻找解决此问题。

干杯, 克雷格

1 个答案:

答案 0 :(得分:1)

/usr/lib64/libQtGui.so似乎有硬编码的rpath来定位依赖的共享库。在您的一台主机上,所需的库位于预期的位置,而在另一台主机上则不是。

你可以使用像elfdump这样的东西从QT共享库中获取RPATH以找出它的外观。然后,您可以在链接命令行上使用(我相信)-R将其指向该主机上实际库的位置。

编辑:我认为你可以做objdump -x <binary/library> | grep -i rpath

之类的事情