5

我正在尝试在 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 安装中的某种设置问题,但我不知道从哪里开始寻找解决这个问题。

干杯,克雷格

4

1 回答 1

1

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

您可以使用诸如 elfdump 之类的东西RPATH从 QT 共享库中取出来找出它的位置。然后,您可以在链接命令行上使用(我相信)-R将其指向该主机上实际安装库的位置。

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

于 2012-11-12T17:53:31.443 回答