windows - MinGW vs MSVS下的Windos导出/导入符号;CMake 的 WINDOWS_EXPORT_ALL_SYMBOLS 被忽略
问题描述
要使用 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 下不需要导入/导出符号。这个答案对吗?那么如何摆脱对导入/导出符号的需要呢?
解决方案
我刚刚遇到了同样的问题。在浏览 CMake 源代码之后,对我有用的修复是还添加:
set( CMAKE_SUPPORT_WINDOWS_EXPORT_ALL_SYMBOLS 1 )
此属性仅适用于 Windows 上的 MS 兼容工具。
CMake 通过在他们知道支持它CMAKE_SUPPORT_WINDOWS_EXPORT_ALL_SYMBOLS
的每个“平台”文件中进行设置来启用此功能。<cmake install>/Modules/Platform
但是,CMake 并未将 MinGW 建模为“平台”。相反,您只需选择“Windows Makefile”、“Windows Ninja”等并手动设置 C/C++/Fortran 编译器以指向 MinGW gcc 编译器。理想情况下,CMake 应该识别操作系统是 Windows 并且编译器是 gcc 并为我们设置它,但现在我们可以通过自己设置来帮助它。
cmake -E __create_def <output-def> <input-list-of-obj-files>
顺便说一句,CMake 使用隐藏命令实现了此功能。我以前想过添加一个自定义规则来运行该命令。虽然它以 开头__
,但它是供内部使用的,并且可能会从一个版本更改为下一个版本。
推荐阅读
- variables - 使用变量内容生成变量名
- typescript - TypeScript 泛型类型未知
- scala - 使用 Scala、Spark 从输入中提取键值对
- c++ - 将三个单独的数组放入共享内存
- php - 我想用来自 formRequest 的消息重定向用户
- elasticsearch - ElasticSearch如何查询最长的任务
- c# - 禁止访问 .NET Core 3.1 MVC 中的所有身份页面
- reactjs - 如何测试 React 元素是否包含 Enzyme 中的文本?
- maven - 如何在 Maven 编译中添加“--add-exports”编译器指令
- java - JDBC Oracle Alter 会话丢失或无效选项