【问题标题】:symbols visibility - shared library vs dll符号可见性 - 共享库与 dll
【发布时间】:2021-07-27 17:24:53
【问题描述】:

我有一个 C++ 动态库,它定义了全局符号 - 函数。当我使用 gcc 编译库时,这些符号默认是可见的。当应用程序链接到几个库时,可能会导致符号冲突。我可以将函数放入命名空间并使用编译标志-fvisibility=hidden 隐藏私有函数。那么 API 函数应该包含以下属性:__attribute__ ((visibility ("default")))

假设我在 Windows 上使用 Microsoft Visual Studio 编译器编译了一个动态库。 有些符号没有用__declspec(dllexport)定义是不是意味着那些符号会被隐藏?

【问题讨论】:

  • 您是否尝试将 GCC 和 ELF 共享对象与 MSVC 和 Windows DLL 进行比较?还是只是具有不同编译器的 Windows DLL?还是别的什么?
  • 如问题描述中所述:GCC 和 ELF 共享对象 vs MSVC 和 Windows DLL。

标签: c++ dll shared-libraries symbols visibility


【解决方案1】:

POSIX 和 Windows 都提供了不同的方法来控制符号的可见性。源代码注释(__attribute__((visibility("default")))__declspec(dllexport))是最常用的方法。 Windows __declspec(dllexport) 在这方面确实完全等同于 POSIX -fvisibility=hidden + __attribute__((visibility("default")))

但是这两个平台还提供了其他替代方法来设置可见性,例如POSIX 上的 export symbol files and version scripts 和 Windows 上的 DEF files。这些替代方案不太常见(主要是因为它们的可移植性较差并且妨碍了一些重要的优化)。

所以__declspec 是否“足够”以及在什么意义上完全取决于您项目的构建脚本。如果不使用 DEF 文件和链接器脚本 - 所有未明确标记为 __declspec(dllexport) 的符号都将被隐藏。

【讨论】:

  • 能否为这个问题添加一个明确的答案?
  • 对不起,如果我的评论听起来带有侮辱性 - 这不是我的本意。
猜你喜欢
  • 2013-05-22
  • 2022-01-22
  • 2022-01-08
  • 2014-12-07
  • 2019-08-02
  • 2011-03-22
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
相关资源
最近更新 更多