Modelica 外部 C 函数调用 DLL 导致退出,代码为 0xffffffffc0000135

Modelica external C function call to DLL results in exit with code 0xffffffffc0000135

简而言之,我的问题是: 如何使用 mingw-gcc 在 Windows 11 中构建一个 DLL,它可以用作OpenModelica 中 Modelica 仿真的外部函数?

我能够让模拟编译并 link,但是一旦它开始执行,程序 returns 退出代码 0xFFFFFFFFC0000135,我认为这是由DLL 有问题。

我有以下用于模拟和其他文件的目录结构:

root
L ExternalFunctionTest.mo (model)
L Resources (folder)
  L Include (folder)
    L myExtLib.h (external function declaration)
  L Library (folder)
    L libMyExtLib.dll (build output for myExtLib.c)
  L Src (folder)
    L myExtLib.c (external function definition)

我在 Windows 11 中使用 gcc(mingw64,Rev5,由 MSYS2 项目 10.2.0 构建)命令构建了 DLL:

gcc -fPIC -shared -o Resources/Library/libMyExtLib.dll Resources/Src/myExtLib.c

我也试过添加选项 -falign-functions -mstackrealign -msse2 -mfpmath=sse,我注意到 OpenModelica 在编译它自己的源文件时使用它,以及添加 -m64。我还尝试切换到使用 OpenModelica 在其 tools/mingw64 子目录中使用的相同编译器来构建 DLL。

当我 运行 模拟时,一切都编译并且 links 正确,但模拟立即崩溃并显示消息:

C:/ ... /modelica_workspace/ExternalFunctionTest.TestModel/TestModel.exe -port=49874 -logFormat=xmltcp -override=startTime=0,stopTime=1,stepSize=0.002,tolerance=1e-6,solver=dassl,outputFormat=mat,variableFilter=.* -r=C:/ ... /modelica_workspace/ExternalFunctionTest.TestModel/TestModel_res.mat -w -lv=LOG_STATS -inputPath=C:/ ... /modelica_workspace/ExternalFunctionTest.TestModel -outputPath=C:/ ... /modelica_workspace/ExternalFunctionTest.TestModel
Process crashed
Process crashed
Simulation process failed. Exited with code 0xffffffffc0000135.

一位同事使用以下命令构建了一个 .so DLL,能够在 Linux 中运行所有内容:

gcc -Wall -fPIC -shared -o Resources/Library/libmyFunction.so Resources/Src/myFunction.c

我使用 Modelica v1.18.0 和 v1.18.1(64 位)进行了尝试。

如果有人能给出一些启示,我们将不胜感激!

ExternalFunctionTest.mo的内容:

package ExternalFunctionTest

  model TestModel
  
     Real x(start=1);
     Real y(start=2);
  
  equation
  
    der(x) = 1;
    
    y = testFunction(x);
  
  end TestModel;
  
  function testFunction
  
    input Real x;
    
    output Real y;
    
    external "C" extFunction(x, y) annotation(Library="libMyExtLib", Include="#include \"myExtLib.h\"");
    
  end testFunction;
  
end ExternalFunctionTest;

myExtLib.c的内容:

#include "../Include/myExtLib.h"

void extFunction(const double input, double * const output)
{
    *output = 2 * input;
}

myExtLib.h的内容:

#ifndef MY_EXT_LIB_H__
#define  MY_EXT_LIB_H__

void extFunction(const double input, double * const output);

#endif

跟进:

该问题与 OpenModelica 1.18 版中的一个问题有关,在该问题中,DLL 在执行模拟之前未添加到路径中,如 Adrian Pop 的评论所述。通过升级到最新的稳定开发版本 1.19.0,问题自行解决。