许多文章和帖子警告在链接和使用 DLL 时可能导致不兼容的编译器设置。
如果您在用 C++ 编写 DLL 并使用 extern “C” 导出函数并仅使用 POD 数据类型或坚持使用接口(纯虚拟)类时遵循最佳实践,那么哪些编译器设置会导致问题?
你怎么知道哪些编译器设置会导致问题?不同的编译器会有不同的设置吗?是否有可用的 Visual C++ 编译器设置列表?
许多文章和帖子警告在链接和使用 DLL 时可能导致不兼容的编译器设置。
如果您在用 C++ 编写 DLL 并使用 extern “C” 导出函数并仅使用 POD 数据类型或坚持使用接口(纯虚拟)类时遵循最佳实践,那么哪些编译器设置会导致问题?
你怎么知道哪些编译器设置会导致问题?不同的编译器会有不同的设置吗?是否有可用的 Visual C++ 编译器设置列表?
这不是一个明确的清单,但我记得的事情:
链接到不同的运行时,例如链接到主可执行文件中的调试 Visual C++ 运行时以及链接到正在导入的 DLL 中的发布版 Visual C++ 运行时,也会导致问题。(代码生成 -> 运行时库选项)
也不建议链接到不同版本的 C++ 运行时(即 VC90 和 VC100)。(常规选项卡 -> 平台工具集选项)
注意 DLL 使用的调用约定(C/C++ 高级选项卡 -> 调用约定选项)
在两个模块之间传递结构时,确保两个模块具有相同的打包(C/C++ -> 代码生成 -> 结构成员对齐选项)
不确定,但听起来很合理,它们应该具有相同的异常处理模型(C/C++ -> 代码生成 -> 启用 C++ 异常选项)
如果您将浮点数传入和传出,则使用相同的浮点模型(C/C++ -> 代码生成 -> 浮点模型选项)
显然,这两个模块是相同的架构(Intel x86、AMD x64、Itanium、ARM 等)
对于问题的第二部分,这里是关于所有编译器选项的综合文档。