【问题标题】:How to use ModelicaError() function in a .dll (Dymola)如何在 .dll (Dymola) 中使用 ModelicaError() 函数
【发布时间】:2020-11-09 06:42:23
【问题描述】:

我有一个 Modelica 外部 C 函数,它调用 .dll 中的函数。

在 .dll 的 C 函数中,我想使用 ModelicaError() 函数。然而当 #include ModelicaUtilities.h 包含许多错误。

这样做的正确方法是什么? 我认为我需要链接到现有的 Dymola .lib,哪个? DYMOLA_STATIC 应该定义为什么? 或者我应该以这样一种方式编译 .dll,以便在使用模型编译后这些缺失的函数可用?

任何对此的见解都会很棒,谢谢

【问题讨论】:

  • 包含 ModelicaUtilities.h 后会出现什么错误?在到达链接阶段之前,您应该不会收到任何错误
  • 如果我没有定义 DYMOLA_STATIC 那么会有一长串错误。如果我将它设置为 DYNMOLA_STATIC 为:#define DYNMOLA_STATIC 那么我得到的东西可以通过包含 dsutil.h 来解决。但是,这会引入更多错误,这些错误可以通过包含 dsblock.h 来解决,这会引入更多我无法解决的错误。但是基本上我觉得我做的不对。
  • ModelicaUtilities.h 仅包含 ModelicaError 的原型。我猜设置:#define DYNMOLA_STATIC extern 是一个好的开始,但是在尝试编译 dll 时仍然会产生错误,因为找不到 ModelicaError 函数。
  • 如果生成 .lib,您只需在生成 dll 时设置 #define DYNMOLA_STATIC extern 和 #include ModelicaUtilities.h 这不起作用。
  • 这篇文章很好地解释了这种情况:stackoverflow.com/questions/34174951/… 所以你需要提供指向 ModelicaError 函数的指针。

标签: dll modelica dymola


【解决方案1】:

据我所知,根据 ModelicaError(或 ModelicaUtilities 的任何其他功能),目前不可能以独立于工具的方式拥有共享对象(Win 上的 DLL)。有关 Modelica 语言规范的未解决问题,请参阅 https://github.com/modelica/ModelicaSpecification/issues/2191

【讨论】:

    【解决方案2】:

    要在 dll 中使用 ModelicaError 函数,您需要发送指向 ModelicaError 函数的指针。要从 Dymola 执行此操作,请创建一个包装函数,将指向 ModelicaError 函数的指针传递给 dll 函数。例如 MathLibraryWrapper:

    #pragma once
    #include "MathLibrary.h"
    int fibonacci_next_int_wrap()
    {
        return fibonacci_next_int(&ModelicaError);
    }
    

    这会调用 dll 中 MathLibary.cpp 中的 fibonacci_next_int 函数。这被修改为接受指向 ModelicaError 函数的指针。

    int fibonacci_next_int(void(*mError)(const char *))
    {
        (*mError)("broken");
        return (int)fibonacci_next();
    }
    

    如果运行它,它会立即崩溃并显示“损坏”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多