1. 程式人生 > >Matlab和C++混合程式設計——在matlab除錯過程中可以跳入VS除錯觀察.cpp檔案中的資料

Matlab和C++混合程式設計——在matlab除錯過程中可以跳入VS除錯觀察.cpp檔案中的資料

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檔案了