MinGW与MSVS下的Windows导出/导入符号忽略CMake的WINDOWS_EXPORT_ALL_SYMBOLS

dced5bon  于 2023-06-23  发布在  Windows
关注(0)|答案(1)|浏览(243)

若要使用Visual Studio生成C库,请使用CMake命令

set(WINDOWS_EXPORT_ALL_SYMBOLS ON)

避免了在函数声明前添加__declspec(dllexport)__declspec(dllimport);只有全局变量才需要显式导入/导出符号。
在MinGW下(阅读:MinGW或其推荐的替代品Mingw-w 64),这不起作用。将应用程序(也是用MinGW构建的)链接到我的库失败了,直到我在每个函数前面粘贴了导入/导出符号。而长的答案https://stackoverflow.com/a/32284832/1017348则相反:在MinGW下不需要导入/导出符号。这个答案对吗?那么,如何摆脱对导入/导出符号的需求呢?

vatpfxk5

vatpfxk51#

我刚刚遇到了同样的问题。在浏览了CMake源代码之后,对我有效的修复方法是添加:

set( CMAKE_SUPPORT_WINDOWS_EXPORT_ALL_SYMBOLS 1 )

CMake says
此属性仅为Windows上的MS兼容工具实现。
CMake通过在<cmake install>/Modules/Platform中的每个“平台”文件中设置CMAKE_SUPPORT_WINDOWS_EXPORT_ALL_SYMBOLS来启用此功能,因为他们知道支持它。然而,CMake并没有将MinGW建模为“平台”。相反,你只需选择“Windows Makefile”,“Windows Ninja”等。手动设置C/C++/Fortran编译器指向MinGW gcc编译器。理想情况下,CMake应该识别操作系统是Windows,编译器是gcc,并为我们设置这些,但现在我们可以自己设置。
顺便说一句,CMake通过一个隐藏的cmake -E __create_def <output-def> <input-list-of-obj-files>命令实现了这个功能。我以前考虑过添加一个自定义规则来运行该命令。虽然它以__开始,但它是供内部使用的,可能会从一个版本到下一个版本发生变化。

相关问题