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

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中)


可以愉快的调试啦!!!!

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值