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
注意:这里的-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中)
可以愉快的调试啦!!!!
具体步骤是怎样的呢??
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++混合编程——在matlab调试过程中可以跳入VS调试观察.cpp文件中的数据
- [C++] gdb高级调试方法
- Linux C++ 调试神技--如何将Linux C++ 可执行文件逆向工程到Intel格式汇编
- C++调试时要让窗口一直打开的方法
- C++ 开发中自定义调试信息的输出方法
- error: C++ preprocessor "/lib/cpp" fails sanity check错误解决方法
- C++与matlab用dll或者Lib的方式混编方法
- c和C++的调试打印输出方法
- c++ 调试过程中 “没有可用于当前位置的源代码” 和 总是出现反汇编窗口的 解决方案
- 【matlab】MATLAB程序调试方法和过程
- MATLAB与C++混合编程:动态链接库方法实现混合编程及常见错误解决办法
- 在 Linux 平台中调试 C/C++ 内存泄漏方法
- 《离散数学》用C++实现第二类Stirling数的递归与(非递归)递推的方法 ,并且在实现了s(n-k)=S(n-1,k-1)+k*S(n-1,k)用递归、非递归方式之后,比教两个实验的调试速度、耗时
- [C++] gdb高级调试方法
- VC6.0和VS2005查看查看C或者C++文件汇编代码的方法
- configure: error: C++ preprocessor "/lib/cpp" fails sanity check错误解决方法
- 解决VS2010编写C++程序时,按F5或者Ctrl+F5进行调试时没有结果输出的方法。
- C++与matlab用dll或者Lib的方式混编方法
- 浅析将matlab函数编译成dll供Cpp调用的方法