Matlab和C++混合程式設計——在matlab除錯過程中可以跳入VS除錯觀察.cpp檔案中的資料
阿新 • • 發佈:2019-01-09
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檔案)。
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中執行除錯,這是關鍵步驟)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檔案)
VS--->除錯--->附加到程序----->
執行完後會發現當前的VS是出於除錯狀態
再開啟當前需要除錯的.cpp檔案(就在matlab的當前工程的目錄下)——>在需要的地方設定斷點——>返回到matlab中進行除錯(最好能在呼叫cpp檔案的地方設定斷點,方便除錯的時候進入VS中,但也可以不加)
3.在VS中當碰到當前的這種狀態的時候,則要停止除錯才能返回matlab中。在matlab中需要除錯下一個.cpp函式的時候,VS則需要重新新增一次matlab程序(重新執行第2步),否則會失效
按照上面的步驟,就可以實現在一個matlab工程中通過VS除錯多個.cpp檔案了