c++ - 静态库中的隐藏符号

标签 c++ shared-libraries static-libraries symbols visibility

我有一个 C++ 共享库 - libA.so .我使用 -fvisibility=hidden 隐藏符号旗帜。应该可见的符号具有以下属性:__attribute__ ((visibility ("default"))) .该库链接到静态库 - libB.a .该静态库 ( libB.a ) 中的所有符号应该仅对共享库 ( libA.so ) 可见。我也用标志 -fvisibility=hidden 编译了静态库.我得到了想要的结果 - 来自 libB.a 的符号仅对 libA.so 可见但对外界隐藏,例如以下命令 nm -C libA.so不显示来自 libB.a 的符号.
你能解释一下如何标志-fvisibility=hidden在上述情况下与静态库在内部工作?

最佳答案

添加了可见性功能以支持限制共享库的接口(interface),即减少导出函数的数量。默认情况下(没有 -fvisibility=hidden )链接器将导出库中的所有函数,在大多数情况下,这不是您想要的。
在静态库链接期间,即在链接时忽略可见性 libB.a并且从它链接器中提取函数根本不会查看可见性注释。另一方面,在函数被(从 libB.a )拉入最终共享库( libA.so )之后,它们将被导出并污染 libA 的界面,除非你通过 -fvisibility=hidden 隐藏它们。编译静态库本身时。

关于c++ - 静态库中的隐藏符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67414559/

相关文章:

android - 如何从库中找到 Activity 的引用并关闭(完成()) Activity ?

shared-libraries - 缺少libsourcey -fPIC编译错误

linux - 创建静态库时嵌入所有外部引用

ios - 构建静态框架和内部链接其他开源库的设计方法

c++ - 弃用未使用的虚拟方法

c++ - 非数据类型模板参数,生成更多特化?

c++ - 让不同的实例进行通信

c++ - 为什么函数参数求值不能排序?

c++ - 使用 dlopen() 引用共享库插件的正确方法是什么?

cocoa - 静态cocoa/cocoa-touch库应该基于什么样的SDK?