假设我的软件项目A作为共享库(libA.so)提供。 A使用第三方库B,它在构建libA.so时作为共享库链接。 (虽然我很乐意使用libB.a而不是libB.so,如果这是解决方案的一部分。)B由A使用,但严格来说,链接到A的应用程序不需要看到任何B的符号,它不是A公共API的一部分。
好的,这就是问题所在:有些应用程序出于自身原因链接到B,以及针对A,如果B的版本(应用程序使用的版本和构建时链接的A版本)不匹配,随着符号发生冲突,随机崩溃。
如何根据A的需要解决所有B的符号,而不是在libA.so中导出为可见符号?换句话说,我不希望连接A的应用程序直接解决B的符号。这甚至可能吗?
首先,我需要Linux上的解决方案,但知道如何在OSX和/或Windows上解决问题也将有所帮助。
我理解如何限制A本身中符号的可见性(不必是A的公共API的一部分),但是如何为依赖库B执行此操作?
答案 0 :(得分:1)
...一些应用程序出于自身原因链接到B ... 换句话说,我不希望连接A的应用程序直接解决B的符号。
考虑一下:如果你阻止应用程序链接B的符号,应用程序将如何满足“它自己的理由来链接B”?
你的问题(如上所述)是自相矛盾的。
现在,用于链接同一可执行文件的不同部分的多个版本的B显然是一个问题。
我所知道的唯一解决方案是让你“隐藏”你完全使用B的事实。这样做的方法是:
libB.a
和libA.so
内的B符号,因此不会导出它们。
使用linker version script 请注意,libB.a
如果在{ GPL将其副本放入libA.so
可能需要您满足libB
许可条款。请仔细阅读并咨询您的律师。