1

假设我的软件项目 A 作为共享库 (libA.so) 发布。A 使用第 3 方库 B,它在我构建 libA.so 时链接为共享库。(虽然我很乐意使用 libB.a 而不是 libB.so,如果这是解决方案的一部分。) B 由 A 使用,但严格来说,链接到 A 的应用程序不需要看到任何B 的符号,它不是 A 的公共 API 的一部分。

好的,问题来了:一些应用程序出于自身原因链接到 B,以及链接到 A,如果 B 的版本(应用程序使用的版本和 A 在构建时链接的版本)不匹配,则是符号冲突时的随机崩溃。

如何使 B 的所有符号都解决 A 的需求,但不导出为 libA.so 中的可见符号?换句话说,我不希望链接到 A 的应用程序直接解析 B 的符号。这甚至可能吗?

首先,我需要 Linux 上的解决方案,但知道如何在 OSX 和/或 Windows 上解决问题也会有所帮助。

我了解如何限制 A 本身中符号的可见性(不一定是 A 的公共 API 的一部分),但是如何为依赖库 B 执行此操作?

4

1 回答 1

1

...某些应用程序出于自身原因链接到 B ... 换句话说,我不希望链接到 A 的应用程序直接解决 B 的符号。

想一想:如果你阻止应用程序链接到 B 的符号,应用程序将如何满足“它自己链接到 B 的理由”?

您的问题(如前所述)是自相矛盾的。

现在,用于链接同一可执行文件的不同部分的多个版本的 B 显然是一个问题。

我知道的唯一解决方案是让您“隐藏”您完全使用 B 的事实。这样做的方法是:

  1. 链接反对libB.a, 和
  2. 将 B 的符号隐藏在 中libA.so,因此它们不会被导出。这是使用链接器版本脚本最容易实现的。

请注意,如果libB.a根据例如 GPL 分发,则将其副本放入libA.so可能需要您满足libB许可条款。小心行事并咨询您的律师。

于 2012-05-18T05:50:40.773 回答