MinGW 与 MSVC 下的 Windows export/import 符号; CMake WINDOWS_EXPORT_ALL_SYMBOLS 忽略
Windos export/import symbols under MinGW vs MSVS; CMake's WINDOWS_EXPORT_ALL_SYMBOLS ignored
要使用 Visual Studio 构建 C 库,CMake 命令
set(WINDOWS_EXPORT_ALL_SYMBOLS ON)
使我免于在函数声明前添加 __declspec(dllexport)
或 __declspec(dllimport)
;只有全局变量才需要显式 import/export 符号。
在 MinGW 下(阅读:MinGW 或其推荐的替代品 Mingw-w64)这不起作用。将应用程序(也是用 MinGW 构建的)链接到我的库失败,直到我在每个函数前面粘贴 import/export 符号。而长答案 则相反:MinGW 下不需要 import/export 符号。这个答案对吗?那么如何摆脱对 import/export 符号的需要?
我刚遇到同样的问题。在浏览了 CMake 源代码之后,对我有用的修复方法是还添加:
set( CMAKE_SUPPORT_WINDOWS_EXPORT_ALL_SYMBOLS 1 )
This property is implemented only for MS-compatible tools on Windows.
CMake 通过在 <cmake install>/Modules/Platform
中的每个 "Platform" 文件中设置他们知道支持它的 CMAKE_SUPPORT_WINDOWS_EXPORT_ALL_SYMBOLS
来启用此功能。但是,CMake 不会将 MinGW 建模为 "Platform"。相反,您只需选择 "Windows Makefile"、"Windows Ninja" 等,然后手动将 C/C++/Fortran 编译器设置为指向 MinGW gcc 编译器。理想情况下,CMake 应该识别 OS 是 Windows 并且编译器是 gcc 并为我们设置它,但现在我们可以通过自己设置来帮助它。
顺便说一句,CMake 使用隐藏的 cmake -E __create_def <output-def> <input-list-of-obj-files>
命令实现了此功能。我以前想过向 运行 该命令添加自定义规则。尽管它以 __
开头,但它仅供内部使用,可能会从一个版本更改为下一个版本。
要使用 Visual Studio 构建 C 库,CMake 命令
set(WINDOWS_EXPORT_ALL_SYMBOLS ON)
使我免于在函数声明前添加 __declspec(dllexport)
或 __declspec(dllimport)
;只有全局变量才需要显式 import/export 符号。
在 MinGW 下(阅读:MinGW 或其推荐的替代品 Mingw-w64)这不起作用。将应用程序(也是用 MinGW 构建的)链接到我的库失败,直到我在每个函数前面粘贴 import/export 符号。而长答案 则相反:MinGW 下不需要 import/export 符号。这个答案对吗?那么如何摆脱对 import/export 符号的需要?
我刚遇到同样的问题。在浏览了 CMake 源代码之后,对我有用的修复方法是还添加:
set( CMAKE_SUPPORT_WINDOWS_EXPORT_ALL_SYMBOLS 1 )
This property is implemented only for MS-compatible tools on Windows.
CMake 通过在 <cmake install>/Modules/Platform
中的每个 "Platform" 文件中设置他们知道支持它的 CMAKE_SUPPORT_WINDOWS_EXPORT_ALL_SYMBOLS
来启用此功能。但是,CMake 不会将 MinGW 建模为 "Platform"。相反,您只需选择 "Windows Makefile"、"Windows Ninja" 等,然后手动将 C/C++/Fortran 编译器设置为指向 MinGW gcc 编译器。理想情况下,CMake 应该识别 OS 是 Windows 并且编译器是 gcc 并为我们设置它,但现在我们可以通过自己设置来帮助它。
顺便说一句,CMake 使用隐藏的 cmake -E __create_def <output-def> <input-list-of-obj-files>
命令实现了此功能。我以前想过向 运行 该命令添加自定义规则。尽管它以 __
开头,但它仅供内部使用,可能会从一个版本更改为下一个版本。