1

我试图弄清楚为什么我的 C/C++ 程序在我用engOpen(). 下面的代码打印Hello World然后抛出一个APPCRASH.

什么可能导致此崩溃,或者我如何从这里调试?

测试MATLAB.c

#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;
}

输出后可执行文件在运行时崩溃

更多细节

我在用:

  • MATLAB R2012a
  • mingw-w64 gcc 版本 4.8.0
  • 64 位 Windows 7

为了回应一些现有的 SO Q&A,我有

  • 确认我正在链接到C:\Program Files\MATLAB\R2012a\extern\lib\win64\microsoft\libeng.liband C:\Program Files\MATLAB\R2012a\extern\lib\win64\microsoft\libmx.lib
  • 包含C:\Program Files\MATLAB\R2012a\bin\win64在我的路径中,其中包含libengine.dlllibmx.dll
  • matlab /regserverWindows 命令提示符运行

请注意,如果我将未执行engOpen()if语句放入其中,则代码将运行完成。

我也不认为这是 mingw 所固有的,因为在 32 位 WinXP 机器上使用 MATLAB 2011 和mingw32.

编译器和链接器输出位于http://pastebin.com/z9CAsb6X

4

3 回答 3

0

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

warning('off','MATLAB:ClassInstanceExists') % Add this line

到我的matlab代码,这可能意味着我的代码中确实不需要一些matlab类,但matlab编译器仍然想要找到?(我猜...)

如果这不能直接工作,您可能想要禁用更多警告?...

于 2014-04-15T10:16:16.570 回答
0

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

我的设置是MinGW 4.8.1 64bit, Win7 64bit, Matlab 64bit.

这个对我有用。

于 2013-07-01T05:51:10.230 回答
0

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

http://oldwiki.mingw.org/index.php/CreateImportLibraries

于 2013-04-24T13:47:28.583 回答