【问题标题】:Is it allowed to link rtti enabled DLL within rtti disabled application?是否允许在禁用 rtti 的应用程序中链接启用 rtti 的 DLL?
【发布时间】:2010-11-17 07:44:25
【问题描述】:

我有一个解决方案来构建一个在其项目属性中启用运行时类型信息的 DLL。这是 Visual Studio 2005 中的默认设置 (/GR)。在我们的库中,我们有很多 dynamic_casts,所以我目前无法在没有运行时类型信息的情况下构建 DLL。

现在我的客户正在使用 Dassault Systèmes 的开发工具,该工具声明他们无法使用运行时类型信息。它始终被禁用 (/GR-)。

问题是这是否有问题?

我用一个小例子尝试了这种情况,在这个例子中,一个 DLL 是用一些代码进行动态转换创建的。 DLL 是在启用的情况下构建的。一个小型应用程序使用 DLL,尤其是带有 dynamic_casts 的代码。此应用程序是构建 RTTI已禁用。它工作正常。但是由于不可预测的行为,任何事情都可能发生......

我想告诉我的客户,将 DLL 与其中一些使用 RTTI 和其他不使用 RTTI 混合不是问题,但我找不到有关它的详细信息(使用 Google、MSDN 等)。有谁知道这个问题的答案吗?

【问题讨论】:

    标签: visual-studio dll visual-studio-2005 rtti


    【解决方案1】:

    恕我直言,只要您不调用 dynamic_cast,就不应该有问题。 虽然 Rtti 是一个非常简单的机制,但混合设置应该不会有什么坏处。 它可能只会伤害忘记它并编写失败代码的开发人员。

    大多数时候 dynamic_cast 都不是设计问题。

    【讨论】:

      【解决方案2】:

      是的,你可以,但有很大的限制。其中一些:

      • 不要从 DLL 中传递任何异常,
      • 不要在非 RTTI 代码上使用 dynamic_cast,
      • 通过比较 DLL 中类数组的大小 sizeof(DllClass[10]) != sizeof(DllClass)*10 可以得到奇怪的效果
      • ...

      在非 RTTI 环境中使用启用 RTTI 的 DLL 最鲜明的例子是 inproc OLE 服务器。您可以使用嵌入到任何应用程序中的任何选项开发 DLL。

      【讨论】:

        猜你喜欢
        • 2011-12-02
        • 2011-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-16
        相关资源
        最近更新 更多