2017-09-23 192 views
1

在编写共享库时,通常建议隐藏所有内部符号以减少动态链接时间,通常使用链接描述文件或-fvisibility选项。将静态库链接到共享库时应该隐藏符号吗?

  • 内部静态库
  • 第三方静态库(例如,libuv)

所有:

在我的情况下,共享库两种类型的其他库的链接使用-Wl,--whole-archive选项将它们链接到共享库中,以便生成的共享库自足并且仅链接到stdlib。

来自内部静态库的所有符号都是隐藏的,因为它们不是公共API的一部分。

问题是隐藏来自第三方静态库的符号有什么优点和缺点?是否有最佳做法和已知的陷阱?一方面,它们不是我图书馆的公共API的一部分。另一方面,它们是第三方库的公共API的一部分。

我猜想用户想要链接到另一个版本的同一个第三方库时会出现问题。理论上隐藏它的符号可能会解决它们,但它认为在实践中它可能会导致一些新的意想不到的问题。

回答

1

在我看来,你应该隐藏所有不属于你的API的符号。您似乎还需要一个选项--exclude-libs,ALL将第三方静态库符号转换为隐藏符号。我不知道任何解决方案的缺点,它加快了动态链接器,也没有看到任何缺点进一步静态链接与另一个库版本..因为它的静态链接不动态链接(热交换或如此)。