1.在matlab中为.cpp使用mex编译生成.mexw64(64位)文件
在matlab中封装编译函数: compile_gc(debug_flag)
compile_gc(debug_flag=1):生成两种文件,(.mexw64和.mexw64.pdb)
compile_gc:.mexw64
注意:如果文件中已经存在.mexw64文件,则不需要执行该步骤,但是使用mex编译生成的时候移动要使用mex -g,否则调试的时候不会跳入vs中执行相关跟踪操作(并且每次关闭matlab的时候还需要重新-g编译mex.c文件)。
function compile_gc(debug_flag)
if strfind(computer(),'64')
defs = '-DA64BITS '; % for 64bit machines - define pointer type
else
defs = '';
end
% if mj < 7 || (mj==7 && mn < 3)
if verLessThan('matlab','7.3')
defs = [defs, '-DmwIndex=int -DmwSize=size_t '];
end
if nargin>0 && debug_flag
debugs = ' -g ';
sprintf('mex -g');
else
debugs = ' -O ';
end
cmd = sprintf('mex %s -largeArrayDims %s GraphCutMex.cpp graph.cpp GCoptimization.cpp GraphCut.cpp LinkedBlockList.cpp maxflow.cpp',...
debugs, defs);%<pre name="code" class="plain" style="color: rgb(51, 51, 51);">%%GraphCutMex.cpp graph.cpp GCoptimization.cpp GraphCut.cpp LinkedBlockList.cpp maxflow.cpp(这个使用自己的.cpp文件代替,我这里编译了6个.cpp文件)
eval(cmd);cmd = sprintf('mex %s -largeArrayDims %s GraphCut3dConstr.cpp graph.cpp GCoptimization.cpp GraphCut.cpp LinkedBlockList.cpp maxflow.cpp',... debugs, defs);eval(cmd);cmd = sprintf('mex %s -largeArrayDims %s GraphCutConstrSparse.cpp graph.cpp GCoptimization.cpp GraphCut.cpp LinkedBlockList.cpp maxflow.cpp',... debugs, defs);eval(cmd);cmd = sprintf('mex %s -largeArrayDims %s GraphCutConstr.cpp graph.cpp GCoptimization.cpp GraphCut.cpp LinkedBlockList.cpp maxflow.cpp',... debugs, defs);eval(cmd);
2.
打开VS,填加matlab进程(经过多次试验,matlab中每次重新调试mexFunction函数的时候,都要做这一步,否则不会跳入VS中执行调试,这是关键步骤)
VS--->调试--->附加到进程----->
执行完后会发现当前的VS是出于调试状态
再打开当前需要调试的.cpp文件(就在matlab的当前工程的目录下)——>在需要的地方设置断点——>返回到matlab中进行调试(最好能在调用cpp文件的地方设置断点,方便调试的时候进入VS中,但也可以不加)
3.在VS中当碰到当前的这种状态的时候,则要停止调试才能返回matlab中。在matlab中需要调试下一个.cpp函数的时候,VS则需要重新添加一次matlab进程(重新执行第2步),否则会失效
按照上面的步骤,就可以实现在一个matlab工程中通过VS调试多个.cpp文件了