WINDOWS_EXPORT_ALL_SYMBOLS

3.4 版本新增。

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

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

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

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

  • 在编译器生成对虚拟函数表(例如,带有虚函数的类的委托构造函数)的引用时,必须用 __declspec(dllimport) 标记整个类,才能链接到 .dll 中的 vftable。

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

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

当创建目标时,如果设置了 CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS 变量,则此属性会根据该变量的值进行初始化。