符号可见性 - 共享库与 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)
的符号都将被隐藏。
我有一个 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")))
。
但是这两个平台还提供了其他选项来设置可见性,例如
所以 __declspec
是否“足够”以及在何种意义上完全取决于您项目的构建脚本。如果不使用 DEF 文件和链接描述文件 - 所有未明确标记为 __declspec(dllexport)
的符号都将被隐藏。