符号可见性 - 共享库与 dll

symbols visibility - shared library vs dll

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

假设我使用 Microsoft Visual Studio 编译器在 Windows 上编译动态库。 某些符号未定义 __declspec(dllexport) 是否意味着这些符号将被隐藏?

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

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

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