【问题标题】:Can I use a shared library compiled on Ubuntu on a Redhat Linux machine?我可以在 Redhat Linux 机器上使用在 Ubuntu 上编译的共享库吗?
【发布时间】:2009-11-21 08:18:34
【问题描述】:

我在我的 Ubuntu 9.10 桌面上编译了一个共享库。我想将共享库发送给拥有 Red Hat Enterprise 5 盒子的合作开发者。

他可以在他的机器上使用我的共享库吗?

【问题讨论】:

  • 如果编译器相同,我认为你应该是

标签: c++ ubuntu shared-libraries redhat


【解决方案1】:

第一点:所有关于编译器版本的答案似乎都被误导了。重要的是链接(当然还有架构)。

如果您将 .so 文件复制到启动系统(例如,复制到其自己的 /usr/local/*/opt/* 目录中)然后尝试使用 LD_PRELOAD 环境设置运行预期的可执行文件.如果链接器 (ld-linux.so) 能够解析两者之间的所有符号,则程序应该加载并运行。

所以它应该是可能的,并且相当安全(只要你没有覆盖任何现有的系统库并且只使用 LD_* /etc/ld.so.preload (在 chroot 中?)魔术将目标可执行文件链接到这个库。

但是,我认为这是个坏主意。您有包管理问题。 Ubuntu 和 Red Hat 都有很好的包管理工具。使用它们! (请注意,询问有关包管理问题的适当位置是 ServerFault 或 SuperUser,绝对不是这样)。

【讨论】:

  • 谢谢,我会阅读 LD_PRELOAD 等内容,看看是否有任何进展。会考虑为他构建一个包来安装
【解决方案2】:

不太可能:如果它真的有效,你就不会问这个问题了,对吗?

根据DistroWatch,Ubuntu 9.10 使用glibc-2.10.1,而 RHEL-5.4 使用glibc-2.5。这意味着,如果您的库引用了 GLIBC_2.6 及更高版本的任何符号,它将无法在 RHEL-5 上运行。

您可以通过以下方式判断您是否使用任何此类符号(以及哪些符号):

readelf -s /path/to/your/library.so | egrep 'GLIBC_2.([6-9]|10)'

如果输出非空,则库将无法在 RHEL-5 上运行。

您可以使用autopackage 构建与 RHEL-5 兼容的库。

【讨论】:

  • 非常喜欢readelf的输出(类似于Windows平台的dumpbin)。顺便说一句,运行上述命令与任何“违规字符串”都不匹配,因此理论上它应该可以工作。不过,正如您和其他用户所建议的那样,我会考虑使用包管理器。
【解决方案3】:

我加入了希努斯。恕我直言,在 Ubuntu 和 RHEL 的情况下,它将是 gcc,与 glibc 紧密耦合。因此,如果在两台机器上都相同,那么它很可能可以运行。

但是为什么要猜测,做一个小试驾(主要有几行),如果它正在运行,那么一个更大的程序很有可能可以在“敌对”环境中运行:)

【讨论】:

    【解决方案4】:

    最好的解决方案是将您的代码提供给您的合作开发者, 让我们编译它!!!!

    你有几个解决方案

    • 将他的 gcc 升级到与您相同的版本
    • 在你的电脑上安装他的gcc版本并编译

    您必须检查您是否都使用相同的 32 位或 64 位架构。

    我的看法是你可能会遇到一些问题,因为你可能没有使用相同的 glibc .

    【讨论】:

      【解决方案5】:

      是的,这是可能的。为您的合作伙伴提供一个静态库,并使您的 gcc 保持相同或兼容的版本。你可以在这里查看我的帖子:https://zqfan.github.io/2021/07/01/cpp-static-library/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        • 2021-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多