在C/C+中通过engOpen调用MATLAB时崩溃+;在64位Windows 7上使用mingw-w64

在C/C+中通过engOpen调用MATLAB时崩溃+;在64位Windows 7上使用mingw-w64,c,matlab,mingw,32bit-64bit,mingw-w64,C,Matlab,Mingw,32bit 64bit,Mingw W64,我正在试图弄清楚,当我用engOpen()调用MATLAB的引擎时,我的C/C++程序为什么会崩溃。下面的代码打印Hello World,然后抛出一个APPCRASH 什么可能导致此崩溃,或者如何在此进行调试 testMATLAB.c #包括 #包括“发动机.h” int main(){ printf(“Hello World.\n”); 发动机*ep; 如果(!(ep=engOpen(NULL))){ printf(“无法启动MATLAB引擎\n”); }否则{ printf(“打开Matla

我正在试图弄清楚,当我用
engOpen()
调用MATLAB的引擎时,我的C/C++程序为什么会崩溃。下面的代码打印
Hello World
,然后抛出一个
APPCRASH

什么可能导致此崩溃,或者如何在此进行调试

testMATLAB.c
#包括
#包括“发动机.h”
int main(){
printf(“Hello World.\n”);
发动机*ep;
如果(!(ep=engOpen(NULL))){
printf(“无法启动MATLAB引擎\n”);
}否则{
printf(“打开Matlab引擎”);
}
返回0;
}

更多细节 我正在使用:

  • MATLAB R2012a
  • mingw-w64 gcc版本4.8.0
  • 64位Windows 7
为了回应一些现有的SO Q&a,我

  • 确认我正在链接到
    C:\Program Files\MATLAB\R2012a\extern\lib\win64\microsoft\libeng.lib
    C:\Program Files\MATLAB\R2012a\extern\lib\win64\microsoft\libmx.lib
  • 在我的路径中包含
    C:\Program Files\MATLAB\r2012 a\bin\win64
    ,其中包含
    libengine.dll
    libmx.dll
  • 从windows命令提示符运行matlab/regserver
注意,如果我将
engOpen()
放在未执行的
if
语句中,那么代码将运行到完成

我也不认为这是mingw固有的,因为在32位WinXP机器上,我使用Matlab2011和
mingw32
没有问题


编译器和链接器输出位于

您是如何链接*.lib的?在我的项目中,我使用PostgreSQL,而不是链接提供的MSVC编译的*.lib,我必须将其转换为*.a。我认为这是一个像这样的过程:


我直接使用那些
DLL而不是lib文件进行链接,比如:
libeng.DLL、libut.DLL、libmex.DLL和libmat.DLL

我的设置是
mingw4.8.1 64位、Win7 64位、Matlab 64位


它对我很有用。

我在使用Visual Studio时遇到了类似的问题。我认为这与Matlab64位在关闭后处理警告的方式有关。 我必须补充:(Mathworks解决了我的问题)

对于我的matlab代码,这可能意味着我的代码中不需要一些matlab类, 但matlab编译器还想找到什么?(我猜…)


如果这无法直接工作,您可能希望禁用更多警告

谢谢。我正在仔细阅读这篇文章。同时,您可以看到我在发送的链接的第97行和第98行使用的linker命令似乎适用于链接器抛出链接错误的情况。但在这种情况下,我没有得到链接器错误。你认为它仍然相关吗?对于你的link命令:要链接一个库,我通常使用-L和-L选项的组合,所以我会放-LC:/Progra~1/MATLAB/R2012a/extern/lib/win64/microsoft/-leng,但是我认为链接器也会给你带来错误……如果你在谷歌搜索“gcc-link-msvc-lib”,因此,我认为很明显,您不应该期望*.lib文件与gcc兼容。另一个方法类似于我已经发布的内容:问题是,它们并没有真正将.lib转换为*.a,而是从*.lib/.dll提取的*.def重新生成*.a。我不知道您是否可以将任意的*.lib(不只是封装*.dll)转换为*.a。
#include <stdio.h>
#include "engine.h"

int main(){
printf("Hello World.\n");
    Engine *ep;
        if (!(ep = engOpen(NULL))) {
            printf("Can't start MATLAB engine\n");
        } else {
            printf("Opening Matlab Engine\n");
        }

return 0;
}
warning('off','MATLAB:ClassInstanceExists') % Add this line