如何隐藏另一个包含的静态库的API

How to hide APIs of static library included by another one?

本文关键字:包含 静态 API 另一个 何隐藏 隐藏      更新时间:2023-10-16

我的问题是,我想开发一组要公开的API。让它成为"SetA"。

我使用了一些第三方静态库的API,比如数学求解器。让它成为"SetB"。简而言之,SetA使用SetB的API。

因为我使用"SetB",所以我必须包括它的头和静态库文件。编译时包含"SetB"库,"SetA"库包含"SetB"定义。

然而,我不希望用户因为版本或多个定义的问题而链接"SetB"的定义。我不希望"SetA"的用户必须处理这个问题,所以有可能静态隐藏我链接的定义吗?

您应该使用工具链支持的可见性属性。如果使用clang或gcc,则可以使用__attribute__((visibility ("hidden"))))隐藏符号。这里推荐的另一个选项是更倾向于隐藏默认符号可见性(gcc中的-fvisibility=hidden),并在符号声明中使用__attribute__ ((visibility ("default")))选择性地仅公开应该是API一部分的符号。

此外,要从要链接的静态库中排除符号,可以使用链接器选项--exclude-libs lib1,lib2,...--exclude-libs ALL来指定所有静态库。