假设我的软件项目 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 执行此操作?