如何隐藏另一个包含的静态库的API
How to hide APIs of static library included by another one?
我的问题是,我想开发一组要公开的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
来指定所有静态库。
相关文章:
- 在作为静态成员包含在另一个类中的类的构造函数中使用 cout
- 如果包含映射的静态库与可执行文件和动态库链接,静态映射(变量)是否会被多次释放?
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 如果函数包含静态变量,为什么编译器不执行内联?
- 拒绝包含某些公共静态数据成员的类型
- 包含不同大小静态数组的类的多个实例
- 扩展包含静态函数的类
- 是否可以链接到,包括和使用静态库,而无需额外包含标头/文件
- 如何使用 mongo-cxx-driver 的 **insert** 函数将包含静态数据的多维数组插入到数据库中
- 为什么cmake_link_libraries包含静态库
- 如何在 MAC OS X 上的 CMAKE 项目中包含 C 静态库
- OpenCV和Visual Studio 2015:为什么包含静态库不起作用
- 纯抽象类可以包含静态常量、静态方法或非虚析构函数吗?
- c++无法为包含静态变量的对象设置NULL指针
- c++ 11是否允许非匿名联合包含静态数据成员?
- Caffe是否包含静态初始化失败?
- 如何在c++中强制包含静态库中的静态对象(msvc11)
- 在预处理器指令中包含静态库
- 头文件包含静态分析工具