将静态库链接到共享库时是否应该隐藏符号?

Should I hide symbols when linking a static library into a shared one?

当您编写共享库时,通常建议隐藏所有内部符号以减少动态 linking 时间,通常使用 linker 脚本或 -fvisibility 选项.

在我的例子中,共享库 link 与其他两种类型的库一起编辑:

所有这些都使用 -Wl,--whole-archive 选项 linked 到共享库中,因此生成的共享库是自给自足的,并且 link 仅用于 stdlib。

隐藏内部静态库中的所有符号,因为它们不是 public API.

的一部分

问题是从第三方静态库中隐藏符号的优缺点是什么?是否有任何最佳实践和已知的陷阱?一方面,它们不是我图书馆 public API 的一部分。另一方面,它们是第三方库 public API 的一部分。

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

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