您的位置:首页 > 编程语言 > MATLAB

MATLAB与C++汇编中调试.cpp的方法

2017-10-29 16:47 961 查看
MATLAB是矩阵语言,是为向量和矩阵操作设计的,一般来说,如果运算可以用向量或矩阵实现,其运算速度是非常快的。但若运算中涉及到大量的循环处理,MATLAB的速度令人难以忍受。当必须使用for循环时,可以把它写为MEX文件,这样不必在每次运行循环中的语句时MATLAB都对它们进行解释。将这种文件改写成c或者c++,用mex编译之后在MATLAB里调用。

具体步骤是怎样的呢??

1、编写Mex源文件

会涉及到一些编写的规则,void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){} 这个规则和格式可以百度。

因为任务需要,我在这里以ExtractGabor_Cplus.cpp为例。

2、编写compile文件来编译ExtractGabor_Cplus.cpp,不会写可以参考我的这个案例写法。

注意:因为.cpp用到了opencv,所以在编译的时候需要引入opencv的安装路径。如果你的.cpp文件中没有用到opencv,直接mex -g filename.cpp就编译啦~

compile_logGabor.m

% Compiles mex files
clc;
clear all;

if ispc
disp('PC');
include = ' -ID:\MenghanZhou\Han_Tools\VS2013\opencv\build\include\opencv\ -ID:\MenghanZhou\Han_Tools\VS2013\opencv\build\include\ -ID:\MenghanZhou\Han_Tools\VS2013\opencv\build\include\opencv2\';
%D:\MenghanZhou\Han_Tools\VS2013\opencv\build\include\opencv\
%D:\MenghanZhou\Han_Tools\VS2013\opencv\build\include\
%D:\MenghanZhou\Han_Tools\VS2013\opencv\build\includeopencv2\
libpath = 'D:\MenghanZhou\Han_Tools\VS2013\opencv\build\x64\vc12\lib\';

files = dir(fullfile(libpath, '*.lib'));
lib = [];
for i = 1:length(files),
lib = [lib ' ' libpath '\' files(i).name];
end

eval(['mex -g ExtractGabor_Cplus.cpp' include lib]);

end

if ismac
disp('Mac');

include = ' -I/opt/local/include/opencv/ -I/opt/local/include/';
libpath = '/opt/local/lib/';

files = dir([libpath 'libopencv*.dylib']);

lib = [];
for i = 1:length(files),
lib = [lib ' ' libpath files(i).name];
end

eval(['mex -g logGabor.cpp' include lib]);

end

if isunix
disp('Unix');

include = ' -I/usr/local/include/opencv/ -I/usr/local/include/';
libpath = 'D:\MenghanZhou\Han_Tools\VS2013\opencv\build\x86\vc11\lib\';

files = dir([libpath 'libopencv*.so.2.2']);

lib = [];
for i = 1:length(files),
lib = [lib ' ' libpath files(i).name];
end

eval(['mex -g logGabor.cpp' include lib]);

end

disp('Compilation finished.');


注意:这里的-g选项是调试时必须的。这里很重要的一点是生成的.pdb文件是路径依赖的,即使是同一个.cpp文件生成的mex文件,它们在不同路径下的得到的.pdb文件也不能互用。在某一个路径下调试mex程序(.cpp文件),必须用这个路径下的的.pdb文件。

3、运行compile_logGabor.m,如果.cpp文件没有bug的话,运行之后会出现如下结果。



在你的matlab工程文件夹下会生成下面几个文件。



4、用VS中打开ExtractGabor_Cplus.cpp,注意:导航栏文件----打开-----文件-----选择ExtractGabor_Cplus.cpp就可以了,并不需要建立什么项目。



5、将Matlab进程附加到VS编译器中



成功附加之后,会出现如下效果。



6、在ExtractGabor_Cplus.cpp中添加断点

这个时候的断点有可能是以空心点的方式出现的,正常的。



7、在调用.cpp文件的那一行打断点。



8、运行matlab文件,等待击中断点后,F10进入VS中进行调试。(会自动跳转到VS中)





可以愉快的调试啦!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  matlab c++ mex