在Matlab下利用VS调试C/C++代码
来源:互联网 发布:linux下的网络编程 编辑:程序博客网 时间:2024/06/05 06:36
在Matlab下有时需要调试C/C++代码,如在Matlab下经常调用的支持向量机(SVM)库libsvm就是用C语言编写的,如果想在Matlab下调试C代码,查看中间输出,可以利用VS。这主要涉及C/C++与Matlab的混合编程问题,有兴趣的可以自己找一下相关的资料看一下,这里只介绍Matlab下利用VS进行C/C++代码调试的步骤及其一些注意事项。
第一步:在已经打开的Matlab下要运行一个Matlab的.m文件,其中有一个文件是C/C++语言实现的,比如这里的svmtrain.c文件。现在想要调试svmtrain.c文件,那么接下来看第二步;
第二步:首先要知道的是,在Matlab下调试C/C++代码需要mex以下,至于怎样配置mex请查阅相关资料,而且是在debug版的mex,即如下:
mex -g svmtrain.c
或
mex svmtrain -g
参数-g即表示debug版,参数-g在前或在后无影响。经过这个步骤后便会在当前目录下生成
svmtrain.mexw64
svmtrain.mexw64.pdb
文件。因为文件名和操作系统的差异(本人操作系统是64位的,所以生成的是mexw64文件),生成的文件存在差异,但是不论怎样,肯定会生成mexw和pdb文件。
这里有一点需要注意:这里mex -g svmtrain.c均需在Matlab下的命令行窗口(Command Window)下输入,如果专门写一个脚本文件,如make文件,把这些语句放进去,虽然能够mex成功,生成所需文件,但是无法进去调试,这也许是Matlab存在的bug。
第三步:打开VS(本人这里用的是VS2013),在菜单栏点击TOOLs—>Attach to Process或直接利用快捷键Ctrl+Alt+P,然后找到正在运行的Matlab软件,点击Attach即可。如下图所示:
第三步和第二步可以交换,这两步谁先谁后看自己操作习惯。
第四步:在VS中打开要调试的C/C++文件,如svmtrain.c文件(要在Matlab当前目录下或路径中),在svmtrain.c文件中添加断点,或在Matlab中进入svmtrain函数处单步运行进入step into,注意是在Matlab窗口下调试,进入VS后两者的调试快捷键均可用。如下图所示:
在上图中,左上角可以看到Process旁边的Matlab软件及其进程号,在左下Watch1窗口可以添加要查看的变量。注意,在VS下调试时,Matlab窗口被锁定,除非在VS退出调试(Shift+F5)或调试完成。
还有一点需要注意的是:每次退出调试后,即使没有关闭VS或Matlab,想要重新调试svmtrain.c文件,需要重新按照第二步操作mex那样,否则无法进入VS下调试。
这里有一个示例供大家练习一下test.cpp:
# include "mex.h"# include "math.h"void mexFunction( int nlhs, mxArray *out[], int nrhs, const mxArray *in[] ){// Check whether the inputs are correctif ( nrhs != 2 ){ mexErrMsgTxt("test: Not correct input arguments! 2 Input Argument expected!"); } /* Declare input variables */ mwSize N;double *b;int a;// Record the number of the first input argument// Array: bN = mxGetNumberOfElements( in[ 0 ] );b = ( double* ) mxGetPr( in[ 0 ] );// Get the scalar value: aa = ( int ) mxGetScalar( in[ 1 ] );/* Declare output variables */// Allocate the output spaceout[ 0 ] = mxCreateNumericMatrix( N + 1, 1, mxUINT32_CLASS, mxREAL ); int *c = ( int * )mxGetData( out[ 0 ] );// This is a simple example// add a to each element in b saved in c// You can write your program as you wishfor( int i = 0; i < N; i++ ){c[ i ] = b[ i ] + a;}mexPrintf("B + A Program Done: \t Array b adds value a equals to ...\n");return; }
可以按照上述步骤,尝试一下。注意:C/C++与Matlab混编的入口函数为mexFunction,相当于通常C/C++的main函数。
参考:
Matlab + VS | Matlab2014a + VS2010 Win7 混编调试
- 在Matlab下利用VS调试C/C++代码
- Ubuntu 下VS Code 调试C代码
- matlab中的c程序,在vs中调试
- matlab借助vs调试C程序
- matlab与vs(c++)联合调试
- decoding_encoding.c 在VS下调试错误总结
- Matlab在字符界面下转成C语言代码
- 在vs.net下调试javascript代码
- MATLAB与VC++混合编程(1)——在MATLAB下调试C/C++程序
- MATLAB与VC++混合编程(1)——在MATLAB下调试C/C++程序 【转】
- MATLAB与VC++混合编程(1)——在MATLAB下调试C/C++程序
- Linux c 下代码调试
- 在win10下使用vscode和winbash调试C代码
- matlab下如何调试c函数
- matlab下如何调试c函数
- [C#] 利用部分方法添加调试代码
- [C编译器]在VS中编译调试C程序
- Matlab代码迁移至C++(下)
- 【hdu 1863】 畅通工程
- C/C++使用NotePad++DIY一个IDE
- linux shell使用loop和cursor批量修改sql
- 静态代码块的执行顺序
- POJ 2406 Power Strings(后缀数组或KMP或扩展KMP)
- 在Matlab下利用VS调试C/C++代码
- Linux系统Java环境安装配置
- 方格取数(1) HDU
- 传入一个字符串,输出某个字符或者字符串在传入字符串中的所有位置
- 11.2
- CVPR 2017 全部及部分论文解读集锦
- 朴素贝叶斯
- 吴恩达深度学习第四课:卷积神经网络(学习笔记2)
- Miller_Rabin素数测试与Pollard_Rho分解质因数