如何在.dllDymola中使用ModelicaError函数

问题描述

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

在.dll的C函数中,我想使用ModelicaError()函数。但是当 #include ModelicaUtilities.h被包含在内,会发生许多错误

执行此操作的正确方法是什么? 我认为需要链接到现有的Dymola .lib,哪一个? DYMOLA_STATIC应该定义为什么? 还是应该以某种方式编译.dll,以便在模型编译后可以使用这些缺少的功能

任何对此的深刻见解,谢谢

解决方法

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

,

要在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();
}

如果运行此命令,它将立即崩溃并显示“破碎”。