C/C++与Matlab混合编程及遇到的各种问题

参考链接:

matlab中使用c++:https://blog.csdn.net/bendanban/article/details/37830495

c++中使用matlab:https://www.cnblogs.com/yangang92/p/5312991.html

而我是第二种情况:在c++中使用matlab(matlab 2016a + vs2017)。

 

配置步骤:

按照上面第二个链接编译了matlab文件,将相关文件XXX.h、XXX.lib、XXX.dll(注意:XXX为编译.m文件时给它起的名字,如上面链接中起名为libAdd,就是这句中的红字部分:mcc -W cpplib:libAdd  -T link:lib Add.m)放到了C++工程目录下,并配置了vs中的包含目录、库目录和链接器。

并且比上面链接中的步骤多了一步,在工程的头文件下添加了XXX.h,在工程的资源文件下添加了XXX.dll、XXX.lib。

 

遇到的问题:

1.0x0000000000000000 处有未经处理的异常(在 Project1.exe 中): 0xC0000005: 执行位置 0x0000000000000000 时发生访问冲突。 

按照上面链接写了如下C++的代码(matlab代码同链接):

int main()
{

    salientObjectDetection();
    int a = 10, b = 20;
    int c;
    mwArray mwA(1, 1, mxINT32_CLASS);
    mwArray mwA(1, 1, mxINT32_CLASS);
    mwArray mwA(1, 1, mxINT32_CLASS);
    mwA.SetData(&a, 1);
    mwA.SetData(&b, 1);
    Add(1, mwC, mwA, mwB);
    c = mwC.get(1, 1);
    cout << "c=" << c << endl;


}

结果出现了这样的错误:
 

C/C++与Matlab混合编程及遇到的各种问题_第1张图片

原因是因为照着上面链接敲代码的时候忘记敲这行了:

if (!libAddInitialize())
        return -1;

即忘记对调用的matlab函数进行初始化了,初始化函数为:

XXXInitialize()

相应的,使用完matlab函数以后要对其进行关闭,函数为:

XXXTerminate()

2.0x0000029E9A46F355 处(位于 Project2.exe 中)引发的异常: 0xC0000005: 读取位置 0x0000000000000008 时发生访问冲突。

加上初始化函数的语句以后运行代码,又出现了新的错误。

C/C++与Matlab混合编程及遇到的各种问题_第2张图片

在网上查了好久终于查到了原因和解决办法:https://blog.csdn.net/qq_37469992/article/details/77575049

3.0x00007FF85421A388 处(位于 Project2.exe 中)有未经处理的异常: Microsoft C++ 异常: mwException,位于内存位置 0x000000B122EFF550 处

前两步是按照上面链接跑add.m出现的问题,在add.m成功在vs2017下运行完以后,我开始照猫画虎跑自己的matlab函数了。

然后就遇到了这个问题。通过堆栈调试(调试时依此点:调试——窗口——调用堆栈)发现是我matlab内部代码出现了异常。

但是很奇怪啊,我用matlab 2016a跑同样的函数是没有问题的。

后来我发现matlab代码中有这么几句:

addpath(genpath('./static_smap/'));
addpath(genpath('./motion_smap/'));
datasetPath = './SalientVideo/';

然后经过我的测试发现,如果使用相对路径的话,用c++调用matlab函数时,matlab中的“./”指的是当前c++工程的目录。

修改代码为:(我这个matlab函数位于:“F:/练习/SalientObjectDetection/”下 并且调用了“”F:/练习/SalientObjectDetection/static_smap/”文件夹中的函数)

addpath(genpath('F:/练习/SalientObjectDetection/static_smap/'));
addpath(genpath('F:/练习/SalientObjectDetection/motion_smap/'));
datasetPath = 'F:/练习/SalientObjectDetection/SalientVideo/';

然后重新编译了matlab函数,并把新的.h、.dll、.lib文件放到了相应位置。

然后又出现了同样的错误,而matlab 2016a中还是可以运行的。

后来我尝试性的将addpath()函数中的绝对地址改成相对地址:

addpath(genpath('./static_smap/'));
addpath(genpath('./motion_smap/'));
datasetPath = 'F:/练习/SalientObjectDetection/SalientVideo/';

再重复重新编译,放到相应位置这步,然后重新运行,成功了!

你可能感兴趣的:(matlab,C++学习)