【发布时间】:2009-11-21 08:18:34
【问题描述】:
我在我的 Ubuntu 9.10 桌面上编译了一个共享库。我想将共享库发送给拥有 Red Hat Enterprise 5 盒子的合作开发者。
他可以在他的机器上使用我的共享库吗?
【问题讨论】:
-
如果编译器相同,我认为你应该是
标签: c++ ubuntu shared-libraries redhat
我在我的 Ubuntu 9.10 桌面上编译了一个共享库。我想将共享库发送给拥有 Red Hat Enterprise 5 盒子的合作开发者。
他可以在他的机器上使用我的共享库吗?
【问题讨论】:
标签: c++ ubuntu shared-libraries redhat
第一点:所有关于编译器版本的答案似乎都被误导了。重要的是链接(当然还有架构)。
如果您将 .so 文件复制到启动系统(例如,复制到其自己的 /usr/local/* 或 /opt/* 目录中)然后尝试使用 LD_PRELOAD 环境设置运行预期的可执行文件.如果链接器 (ld-linux.so) 能够解析两者之间的所有符号,则程序应该加载并运行。
所以它应该是可能的,并且相当安全(只要你没有覆盖任何现有的系统库并且只使用 LD_* /etc/ld.so.preload (在 chroot 中?)魔术将目标可执行文件链接到这个库。
但是,我认为这是个坏主意。您有包管理问题。 Ubuntu 和 Red Hat 都有很好的包管理工具。使用它们! (请注意,询问有关包管理问题的适当位置是 ServerFault 或 SuperUser,绝对不是这样)。
【讨论】:
不太可能:如果它真的有效,你就不会问这个问题了,对吗?
根据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 兼容的库。
【讨论】:
我加入了希努斯。恕我直言,在 Ubuntu 和 RHEL 的情况下,它将是 gcc,与 glibc 紧密耦合。因此,如果在两台机器上都相同,那么它很可能可以运行。
但是为什么要猜测,做一个小试驾(主要有几行),如果它正在运行,那么一个更大的程序很有可能可以在“敌对”环境中运行:)
【讨论】:
最好的解决方案是将您的代码提供给您的合作开发者, 让我们编译它!!!!
你有几个解决方案
您必须检查您是否都使用相同的 32 位或 64 位架构。
我的看法是你可能会遇到一些问题,因为你可能没有使用相同的 glibc .
【讨论】:
是的,这是可能的。为您的合作伙伴提供一个静态库,并使您的 gcc 保持相同或兼容的版本。你可以在这里查看我的帖子:https://zqfan.github.io/2021/07/01/cpp-static-library/
【讨论】: