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。
按照上面链接写了如下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;
}
结果出现了这样的错误:
原因是因为照着上面链接敲代码的时候忘记敲这行了:
if (!libAddInitialize())
return -1;
即忘记对调用的matlab函数进行初始化了,初始化函数为:
XXXInitialize()
相应的,使用完matlab函数以后要对其进行关闭,函数为:
XXXTerminate()
加上初始化函数的语句以后运行代码,又出现了新的错误。
在网上查了好久终于查到了原因和解决办法:https://blog.csdn.net/qq_37469992/article/details/77575049
前两步是按照上面链接跑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/';
再重复重新编译,放到相应位置这步,然后重新运行,成功了!