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,问题自行解决。
简而言之,我的问题是: 如何使用 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,问题自行解决。