c++ - DLL 和编译器设置

标签 c++ visual-c++ dll compiler-construction linker

许多文章和帖子都警告在链接和使用 DLL 时可能导致不兼容的编译器设置。

如果您在使用 C++ 编写 DLL 时遵循最佳实践并使用 extern “C” 导出函数,并且仅使用 POD 数据类型或坚持使用接口(interface)(纯虚拟)类,那么哪些编译器设置可能会导致问题?

您如何知道哪些编译器设置会导致问题?不同的编译器会有不同的设置吗?是否有可用的 Visual C++ 编译器设置列表?

最佳答案

这不是最终的列表,但我记得的事情:

  1. 链接到不同的运行时,例如链接到主可执行文件中的调试 Visual C++ 运行时,以及链接到要导入的 DLL 中的发布 Visual C++ 运行时,也会导致问题。 (代码生成 -> 运行时库选项)

  2. 链接到不同版本的 C++ 运行时(即 VC90 和 VC100)也是不可取的。 (常规选项卡 -> 平台工具集选项)

  3. 注意 DLL 使用的调用约定(C/C++ 高级选项卡 -> 调用约定选项)

  4. 在两个模块之间传递结构时,确保两个模块具有相同的包装(C/C++ -> 代码生成 -> 结构成员对齐选项)

  5. 不确定,但听起来很合理,它们应该具有相同的异常处理模型(C/C++ -> 代码生成 -> 启用 C++ 异常选项)

  6. 如果您将 float 传入和传出相同的浮点模型(C/C++ -> 代码生成 -> 浮点模型选项)

  7. 两个模块显然是相同的架构(Intel x86、AMD x64、Itanium、ARM 等)

对于问题的第二部分,here是关于所有编译器选项的综合文档。

关于c++ - DLL 和编译器设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15381328/

相关文章:

c++ - 关于win32编程自定义窗口标题栏

c++ - 预编译 header 和 Visual Studio

java - 运行我生成的 .jar 会产生 "Can' t 在 AMD 64 位平台上加载此 .dll(机器代码=0xbd)”

c# - 如何在C Sharp中使用DLL

c++ - 了解如何使用 SFML 函数将数据添加到 map

c++ - 打印所有继承的类成员变量和方法

windows - Visual Studio Express "for Windows"与 "for Windows Desktop"

c++ - LPTSTR 开头的奇怪字符? C++

c++ - 如果在 WinXP 上的调试版本中使用 boost (C++) 库,则无法执行程序

c++ - 为什么在使用带有接口(interface)指针的多态行为时没有调用析构函数?