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

时间:2015-02-12 04:41:08

标签: c++ c static-libraries encapsulation

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

我使用第三方静态库的一些API,就像数学解算器一样。让它成为“SetB”。简而言之,SetA使用SetB的API。

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

但是,由于版本或多重定义问题,我不希望用户链接“SetB”的定义。我不希望“SetA”的用户必须处理这个问题,那么是否可以隐藏我静态链接的定义?

1 个答案:

答案 0 :(得分:0)

您应该使用工具链支持的可见性属性。如果您使用的是clang或gcc,则可以使用__attribute__((visibility ("hidden"))))隐藏符号。建议here的另一个选项是优先隐藏默认符号可见性(gcc中为-fvisibility=hidden),并在声明中使用__attribute__ ((visibility ("default")))选择性地仅公开应该属于API的符号。符号

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