【问题标题】:DLL and compiler settingsDLL 和编译器设置
【发布时间】:2013-03-13 09:27:29
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    这不是一个确定的清单,但我记得的事情:

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

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

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

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

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

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

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

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

    【讨论】:

    • 另一个让我印象深刻的是“将 wchar_t 视为内置类型”设置
    • 嗯,有趣又出人意料。您认为这个选项为什么会导致问题,这些问题是什么?
    • 我在这里研究了 MSDN 中的选项:msdn.microsoft.com/en-us/library/dh8che7s(v=vs.80).aspx 乍一看,根据是否启用此选项,重载分辨率可能会出乎意料(因为 wchar_t 被定义为 unsigned short 或 __wchar_t 内置)
    • @Zadirion 我遇到了这个设置的问题,这是:stackoverflow.com/questions/14929673/…
    • @RakeshK 啊,当然,这是有道理的。函数需要具有相同的签名,而如果您为“将 wchar_t 视为内置类型”设置了不同的选项,则一个签名将 unsigned short 作为参数,另一个将 __wchar_t 内置类型作为参数范围。完全有道理。感谢您提供的信息,Rakesh K
    猜你喜欢
    • 2011-03-18
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    相关资源
    最近更新 更多