符号可见性 - 共享库与 dll

Irb*_*bis 1 c++ dll visibility symbols shared-libraries

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

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

yug*_*ugr 5

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

但这两个平台还提供其他替代方案来设置可见性,例如导出POSIX 上的符号文件和版本脚本以及Windows 上的DEF 文件。这些替代方案不太常见(主要是因为它们的可移植性较差并且妨碍了一些重要的优化)。

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