【问题标题】:Windos export/import symbols under MinGW vs MSVS; CMake's WINDOWS_EXPORT_ALL_SYMBOLS ignoredMinGW vs MSVC 下的 Windows 导出/导入符号; CMake WINDOWS_EXPORT_ALL_SYMBOLS 被忽略
【发布时间】:2020-05-07 08:44:49
【问题描述】:

要使用 Visual Studio 构建 C 库,请使用 CMake 命令

set(WINDOWS_EXPORT_ALL_SYMBOLS ON)

让我不用在函数声明前添加__declspec(dllexport)__declspec(dllimport);只有全局变量才需要显式导入/导出符号。

在 MinGW(阅读:MinGW 或其推荐的替代品 Mingw-w64)下,这不起作用。将应用程序(也使用 MinGW 构建)链接到我的库失败,直到我在每个函数前面粘贴了导入/导出符号。而长答案https://stackoverflow.com/a/32284832/1017348 则相反:MinGW 下不需要导入/导出符号。这个答案对吗?那么如何摆脱对导入/导出符号的需求呢?

【问题讨论】:

    标签: windows cmake mingw dllexport declspec


    【解决方案1】:

    我刚刚遇到了同样的问题。在浏览了 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> 命令实现了此功能。我以前想过添加一个自定义规则来运行该命令。虽然它以 __ 开头,但它是供内部使用的,可能会从一个版本更改为下一个版本。

    【讨论】:

    • 康拉德,感谢您深入了解。为了以后读者的利益,我可以建议您将“我相信修复是”这样的措辞编辑为“我发现以下修复对我有用” - 明确这不仅仅是猜测,而是经验证明跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2020-01-15
    • 2014-02-18
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多