WINDOWS_EXPORT_ALL_SYMBOLS

在 3.4 版本中添加。

此属性仅为 Windows 上与 MS 兼容的工具实现。

启用此布尔属性以自动创建一个模块定义 (.def) 文件,其中包含在 SHARED 库(或带有 ENABLE_EXPORTS 的可执行文件)的输入 .obj 文件中找到的所有全局符号。模块定义文件将传递给链接器,从而导致所有符号从 .dll 导出。

这简化了将项目移植到 Windows 的过程,减少了对显式 dllexport 标记的需求,即使在 C++ 类中也是如此。函数符号将自动导出,并且可能被调用者链接。但是,在某些情况下,在消费者中编译代码可能需要显式 dllimport 标记。

  • 全局数据符号必须使用 __declspec(dllimport) 显式标记,以便链接到 .dll 中的数据。

  • 在编译器生成对虚函数表引用的情况下,例如在使用虚函数的类的委托构造函数中,整个类必须使用 __declspec(dllimport) 标记,以便链接到 .dll 中的 vftable。

  • 有关数据符号的更多信息,请参阅 MSVC 链接器 /EXPORT 选项

当启用此属性时,也可以将零个或多个 .def 文件指定为目标的源文件。这些文件导出的符号将与从目标文件检测到的符号合并,以生成要传递给链接器的单个模块定义文件。这可以用于从 .dll 导出符号,这些符号不在其任何目标文件中,而是由链接器从依赖项添加(例如 msvcrt.lib)。

如果创建目标时设置了 CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS 变量,则此属性由该变量的值初始化。