【问题标题】:problem with different linux distribution with c++ executable具有 c++ 可执行文件的不同 Linux 发行版的问题
【发布时间】:2011-01-09 14:40:43
【问题描述】:

我有一个可以在我的 linux 机器 (Ubuntu Karmic) 上完美运行的 c++ 代码。 当我尝试在另一个版本上运行它时,我缺少各种共享库。

有没有办法将所有共享库合并到一个可执行文件中?

编辑: 我想我问错了问题。我应该要求一种方法在我的可执行文件已经构建时对其进行静态链接。 我在ermine&statifier找到了答案

【问题讨论】:

    标签: c++ merge shared-libraries linux-distro


    【解决方案1】:

    您所描述的是使用静态库而不是共享库。

    【讨论】:

    • 库需要先编译成静态的!
    • 系统库通常以静态版本提供。但是,这里有一个问题,因为动态链接库的一个功能是确保对不同内核版本或不同硬件的兼容性。在这种情况下,静态链接可能会导致您的程序失败,而动态链接会选择适当的兼容版本。另请注意,除非您已准备好让您的程序获得 GPL 许可,否则很少允许静态链接库,这很好,除非您打算对自己的利润和代码保密。
    • @windfinder,确实如此,但如果您希望能够不依赖共享库,这是唯一的方法。还有其他解决方案可以尝试以智能方式处理依赖关系,但 sagie 询问如何将所有内容合并到一个可执行文件中。
    • 他做到了,但我认为他需要考虑其他解决方案,因为静态链接在很多方面都不能令人满意。有关可能的解决方案,请参阅我的帖子。
    • @Alex,我同意,他可能不知道要问什么问题,这就是为什么我也对你的答案投了赞成票。
    【解决方案2】:

    我不太确定,但您可能希望通过静态链接所有库来创建可执行文件。

    【讨论】:

      【解决方案3】:

      您缺少共享库的可能原因有 3 个:

      • 您正在使用默认情况下在其他发行版中不存在的共享库,或者您已将它们安装在您的主机上,但没有安装在其他发行版上,例如libDBI.so
      • 您在链接时过度指定了版本,例如libz.so.1.2.3 和另一台机器的 API 兼容(主要版本 1)但次要版本不同 2.3,如果它可以链接,它可能会与您的程序一起使用
      • 库的主要版本已更改,这意味着它与libc.so.2libc.so.1 不兼容。

      修复如下:

      • 不要链接您不需要的库,这些库可能不在不同的发行版上,或者,在其他机器上安装其他库,手动或使它们成为您的安装程序包的依赖项(例如使用 RPM)李>
      • 不要在命令行上如此严格地指定版本 - 链接 libz.so.1 而不是 libz.so.1.2.3
      • 针对不同的 libc 版本编译多个版本。

      【讨论】:

        【解决方案4】:

        另一种方法是使用dlopen() 来替代dynamically load 共享库,如果加载失败,请优雅退出,并显示可执行文件需要依赖库才能运行的消息。
        然后用户可以安装适当的库。

        【讨论】:

          【解决方案5】:

          对于此处提到的原始问题,已有多种技术解决方案,例如

          针对多个版本编译 不同的 libc 版本。

          在 其他机器

          但如果您处于 ISV 的位置,那么实际上只有一个明智的解决方案:

          全新安装较旧的系统(例如,如果您以桌面为目标,则使用 Ubuntu 6.x,如果您以服务器为目标,则可能可以追溯到 Red Hat 9)并在此基础上构建您的软件。一般来说,库(当然还有 libc)是向后兼容的,所以在较新的系统上运行不会有问题。

          当然,如果您有非标准或最新版本的 lib 依赖项,这并不能完全解决问题。在这种情况下,正如其他人所建议的那样,如果您想变得健壮,最好使用 dlopen() 并报告问题(或以减少的功能运行)。

          【讨论】:

            【解决方案6】:

            另一种可能的解决方案是使用 statifier (http://statifier.sf.net) 或 Ermine (http://magicErmine.com) 它们都能够将动态可执行文件及其所需的所有库打包到一个自包含的可执行文件中

            【讨论】:

              猜你喜欢
              • 2019-05-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-09-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多