3

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

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

4

5 回答 5

5

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

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

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

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

于 2009-11-21T09:37:41.710 回答
3

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

根据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 兼容的库。

于 2009-11-22T06:28:20.070 回答
0

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

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

于 2009-11-21T08:36:13.590 回答
0

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

你有几个解决方案

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

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

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

于 2009-11-21T08:54:21.010 回答
0

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

于 2021-07-01T09:37:22.123 回答