我有一个 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/