将静态库链接到共享库时是否应该隐藏符号?
Should I hide symbols when linking a static library into a shared one?
当您编写共享库时,通常建议隐藏所有内部符号以减少动态 linking 时间,通常使用 linker 脚本或 -fvisibility
选项.
在我的例子中,共享库 link 与其他两种类型的库一起编辑:
- 内部静态库
- 第三方静态库(例如 libuv)
所有这些都使用 -Wl,--whole-archive
选项 linked 到共享库中,因此生成的共享库是自给自足的,并且 link 仅用于 stdlib。
隐藏内部静态库中的所有符号,因为它们不是 public API.
的一部分
问题是从第三方静态库中隐藏符号的优缺点是什么?是否有任何最佳实践和已知的陷阱?一方面,它们不是我图书馆 public API 的一部分。另一方面,它们是第三方库 public API 的一部分。
我猜当用户想要 link 到同一第三方库的另一个版本时会出现问题。隐藏它的符号理论上可以解决,但是感觉在实践中可能会导致一些新的意想不到的问题。
在我看来,您应该隐藏所有不属于 API 的符号。似乎您还需要一个选项 --exclude-libs,ALL
来将第三方静态库符号转换为隐藏符号。我不知道该解决方案的任何缺点,它加速了动态链接器,也没有看到与另一个库版本进一步静态链接的任何缺点.. 因为它的静态链接不是动态链接(热交换等)。
当您编写共享库时,通常建议隐藏所有内部符号以减少动态 linking 时间,通常使用 linker 脚本或 -fvisibility
选项.
在我的例子中,共享库 link 与其他两种类型的库一起编辑:
- 内部静态库
- 第三方静态库(例如 libuv)
所有这些都使用 -Wl,--whole-archive
选项 linked 到共享库中,因此生成的共享库是自给自足的,并且 link 仅用于 stdlib。
隐藏内部静态库中的所有符号,因为它们不是 public API.
的一部分问题是从第三方静态库中隐藏符号的优缺点是什么?是否有任何最佳实践和已知的陷阱?一方面,它们不是我图书馆 public API 的一部分。另一方面,它们是第三方库 public API 的一部分。
我猜当用户想要 link 到同一第三方库的另一个版本时会出现问题。隐藏它的符号理论上可以解决,但是感觉在实践中可能会导致一些新的意想不到的问题。
在我看来,您应该隐藏所有不属于 API 的符号。似乎您还需要一个选项 --exclude-libs,ALL
来将第三方静态库符号转换为隐藏符号。我不知道该解决方案的任何缺点,它加速了动态链接器,也没有看到与另一个库版本进一步静态链接的任何缺点.. 因为它的静态链接不是动态链接(热交换等)。