如何在.dll(Dymola)中使用ModelicaError()函数

如何在.dll(Dymola)中使用ModelicaError()函数,dll,modelica,dymola,Dll,Modelica,Dymola,我有一个Modelica外部C函数,它调用.dll中的函数 在.dll中的C函数中,我想使用ModelicaError()函数。然而当 #包含ModelicaUtilities.h。如果包含,则会出现许多错误 正确的方法是什么? 我想我需要和现有的Dymola.lib链接,哪一个?DYMOLA_静态应定义为什么? 或者,我应该以这样的方式编译.dll:在使用模型编译后,这些缺失的函数将可用 如果您能深入了解这一点,那就太好了,感谢您在dll中使用ModelicaError函数,并向dll发送指向

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

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

正确的方法是什么? 我想我需要和现有的Dymola.lib链接,哪一个?DYMOLA_静态应定义为什么? 或者,我应该以这样的方式编译.dll:在使用模型编译后,这些缺失的函数将可用


如果您能深入了解这一点,那就太好了,感谢您在dll中使用ModelicaError函数,并向dll发送指向ModelicaError函数的指针。要从Dymola执行此操作,请创建一个包装函数,将指向ModelicaError函数的指针传递给dll函数。例如,MathLibraryWrapper:

#pragma once
#include "MathLibrary.h"
int fibonacci_next_int_wrap()
{
    return fibonacci_next_int(&ModelicaError);
}
这将调用dll中MathLibrary.cpp中的fibonacci_next_int函数。修改此选项以接受指向ModelicaError函数的指针

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

如果运行此命令,它将立即崩溃并出现“断开”。

据我所知,根据ModelicaError(或ModelicaUtilities的任何其他功能),目前不可能以独立于工具的方式拥有共享对象(Win上的DLL)。有关Modelica语言规范的公开问题,请参阅。

包含ModelicaUtilities.h会导致哪些错误?如果我没有定义DYMOLA_STATIC,那么就会有一长串错误。如果我将其设置为DYNMOLA_STATIC为:#define DYNMOLA_STATIC,那么我将得到通过包含dsutil.h来解决的问题。然而,这引入了更多的错误,通过包括dsblock.h解决了这些错误,这引入了更多我无法解决的错误。但是,基本上我觉得我没有正确地进行这项工作。ModelicaUtilities.h只包含modelicarror的原型。我猜设置:#define DYNMOLA_STATIC extern是一个很好的开始,但是在尝试编译dll时仍然会产生错误,因为找不到modelicarror函数。如果生成.lib,您只需设置#define DYNMOLA_STATIC extern和#在生成dll时包含ModelicaUtilities.h,这是不起作用的。这篇文章解释道情况很好:因此您需要提供指向ModelicaError函数的指针。