【问题标题】:Get the complete list of .so dependencies for Qt application? [duplicate]获取 Qt 应用程序的 .so 依赖项的完整列表? [复制]
【发布时间】:2013-09-10 06:25:41
【问题描述】:

我的 Qt 应用程序应该在没有安装 Qt 甚至具有旧版本 glibc 等的 Linux 发行版上运行。所以我决定用我的应用程序分发这些库。我怎样才能获得我的应用程序的完整依赖项列表,包括 Qt 和 glibc 等系统库的依赖项? 还有没有其他方法可以让我的应用程序在没有 glibc 和其他预期版本包的 Linux 发行版上运行?

【问题讨论】:

  • 使用ldd
  • 使用与系统上安装的libc 不同的libc 通常是个坏主意,因为要正确使用它很棘手。此外,Linux 的方式是依靠系统的包管理器来拖入依赖项,而不是与您的程序捆绑它们。当您发现捆绑的libx11 与机器的 X 服务器不兼容时,您会怎么做?
  • @LaszloPapp 不是它的预期方式。我们最终为几乎每个发行版构建单独的包......
  • @artplastika:好的,只是因为没有选择的答案而询问,谢谢。

标签: c++ linux qt shared-libraries


【解决方案1】:

这是可能的,但有点棘手,特别是如果您还需要 glibc。在这种情况下,您甚至需要确保不仅 libc 是合适的,而且您还需要带上相应的 ld 'so'。否则,您可能会在 libc 入口点之后但在您的 main 函数之前遇到段错误。

基本上,当您尝试运行您的应用程序时,您会看到缺少的库,直到您添加所有库。

尝试:ldd -r foo -> 这将告诉您可执行文件或库需要哪些库。在这里你可以找到它的man page

这是我系统中的一个示例:ldd -r /usr/lib/libQt5Quick.so.5.1.0

linux-vdso.so.1 (0x00007fffbb3fe000)
libQt5Qml.so.5 => /usr/lib/libQt5Qml.so.5 (0x00007f376576b000)
libQt5Network.so.5 => /usr/lib/libQt5Network.so.5 (0x00007f3765433000)
libQt5Gui.so.5 => /usr/lib/libQt5Gui.so.5 (0x00007f3764e13000)
libQt5Core.so.5 => /usr/lib/libQt5Core.so.5 (0x00007f3764800000)
libQt5V8.so.5 => /usr/lib/libQt5V8.so.5 (0x00007f376415a000)
libGL.so.1 => /usr/lib/libGL.so.1 (0x00007f3763e2c000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007f3763b27000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007f3763824000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f376347a000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f376325b000)
libz.so.1 => /usr/lib/libz.so.1 (0x00007f3763045000)
libssl.so.1.0.0 => /usr/lib/libssl.so.1.0.0 (0x00007f3762dd9000)
libcrypto.so.1.0.0 => /usr/lib/libcrypto.so.1.0.0 (0x00007f37629ce000)
libpng16.so.16 => /usr/lib/libpng16.so.16 (0x00007f3762799000)
libicui18n.so.51 => /usr/lib/libicui18n.so.51 (0x00007f3762398000)
libicuuc.so.51 => /usr/lib/libicuuc.so.51 (0x00007f3762021000)
libpcre16.so.0 => /usr/lib/libpcre16.so.0 (0x00007f3761dc4000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f3761bc0000)
libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x00007f37618c1000)
librt.so.1 => /usr/lib/librt.so.1 (0x00007f37616b9000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007f37614a3000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007f3766166000)
libnvidia-tls.so.325.15 => /usr/lib/libnvidia-tls.so.325.15 (0x00007f376129f000)
libnvidia-glcore.so.325.15 => /usr/lib/libnvidia-glcore.so.325.15 (0x00007f375ebbf000)
libX11.so.6 => /usr/lib/libX11.so.6 (0x00007f375e884000)
libXext.so.6 => /usr/lib/libXext.so.6 (0x00007f375e671000)
libicudata.so.51 => /usr/lib/libicudata.so.51 (0x00007f375cf27000)
libpcre.so.1 => /usr/lib/libpcre.so.1 (0x00007f375ccbc000)
libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007f375ca9d000)
libXau.so.6 => /usr/lib/libXau.so.6 (0x00007f375c898000)
libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007f375c692000)

【讨论】:

  • 谢谢拉斯洛!我需要一些时间来调查所有依赖项。当我的应用程序运行时,我会接受你的回答!
  • @artplastika:你的应用程序运行了吗?
【解决方案2】:

如果没有glibc,您的应用程序几乎不可能在 Linux 系统上运行;没有其他可能的完整libc 实现的候选者。也就是说,在您的二进制文件上使用ldd 命令;它将列出二进制文件需要的所有动态库以及该系统上已解析的版本。

【讨论】:

  • 他/她确实有 glibc,只是不是他/她写的预期版本...
  • 措辞不清楚;我可以理解你的解释,但它看起来像“没有glibc”。
  • 他明确地问道:“还有其他方法可以让我的应用程序在没有 glibc 和其他预期版本包的 Linux 发行版上运行吗?”请注意“预期版本”部分。我不明白它是如何不清楚的。
猜你喜欢
  • 2016-02-16
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
相关资源
最近更新 更多