【轉帖】總結:m文件轉化為c/c++語言文件,VC編譯

【轉帖】總結:m文件轉化為c/c++語言文件,VC編譯

[轉帖]總結:m文件轉化為c/c++語言文件,VC編譯
matlab使用很方便,但有時候一些特殊的應用需要我們將matlab中m格式的
文件中的程序翻譯成c/c++的形式的程序并在c/c++的編譯器中進行編譯,本
文總結了一般的方法。
需要分兩種情況,第一種是你的m文件中不涉及到有關繪圖的函數;第二種
是需要用到繪圖函數。下面分別用例子來說明:

第一種情況:
1. 建一個m文件,內容為:
%%%%%%%%%%%%%%%%%%%%%%
function y=fork_1(n)
y=0;
for i=1:n
y=y+i;
end
%%%%%%%%%%%%%%%%%%%%%%
保存后在命令窗口中:
輸入:(格式:mcc -t -L Cpp -h 文件名)
mcc -t -L Cpp -h fork_1
然后你會在你的工作目錄下找到fork_1.cpp和fork_1.hpp兩個文件。
2. 在VC中建一個基于對話框的MFC應用程序,名字為testFork1,添加一個
按鈕,并添加按鈕響應函數,函數內容在第五步中說明。將上面生成的
兩個文件拷貝到VC工程的testFork1目錄里。
3. 在VC中選擇:工程--->設置,再選屬性表Link選項,下拉菜單中選擇Input,
在對象/庫模塊中加入附錄A中所列出的內容,注意用空格將它們格開而在忽略
庫中加入附錄B中列出的內容;再選擇屬性表C/C++選項,下拉菜單選General,
在預處理程序定義中添加附錄C中的內容,原來有的內容要保留,并注意用逗號
將它們隔開。再選擇下拉菜單的Precompiled Headers選項,選擇“自動使用預
補償頁眉”,在其中添加stdafx.h ,確定。
4. 選擇:工具--->選擇,屬性頁選擇“目錄”,在include files里面加入:
C:\MATLAB6P5\EXTERN\INCLUDE
C:\MATLAB6P5\EXTERN\INCLUDE\CPP
注意,根據你的matlab的安裝位置的不同,要相應的修改上面的地址。
在Library files里面加入:
C:\MATLAB6P5\EXTERN\LIB\WIN32
C:\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60
注意,根據你的matlab的安裝位置的不同,要相應的修改上面的地址。
5. 在按鈕響應函數所在文件中添加如下的頭文件:
......
#include "matlab.hpp"
#include "fork_1.hpp"
......
函數響應代碼為:
int i;
mwArray n;
n=5;
n=fork_1(n);
i=n.ExtractScalar(1);
CString str;
str.Format("%d",i);
AfxMessageBox(str);
6. 編譯,連接,執行,一切OK!(注意的是如果你的程序中用到了許多其他函數,
matlab會為每個函數生成一個對應的hpp和cpp文件,必須將他們都拷貝你的工
程中去)

第二種情況:
1. 建一個m文件:
%%%%%%%%%%%%%%%%%%%%%
function fork_2()
x=[1 2 3];
y=[1 3 1];
plot(x,y);
%%%%%%%%%%%%%%%%%%%%%
保存后在命令窗口中:
輸入:(格式:mcc -B sglcpp 文件名)
mcc -B sglcpp fork_2
2.
3.
4.
下上各步與前例相似,只是這是會多出來個fork_2_mainhg.cpp,fork_2.exe和
bin文件夾。在拷貝的時候文件fork_2_mainhg.cpp和fork_2.exe不要。但需要將
bin文件夾考到VC的工程目錄中去。
5. 在按鈕響應函數所在文件中添加如下的頭文件:
......
#include "matlab.hpp"
#include "fork_2.hpp"
......
函數響應代碼為:
libmmfileInitialize();
libmwsglmInitialize();
mlfHGInitialize(NULL,NULL);
fork_2();
mlfHGWaitForFiguresToDie();
mlfHGTerminate();
libmmfileTerminate();
libmwsglmTerminate();
6. 編譯,連接,執行,一切OK!(注意的是如果你的程序中用到了許多其他函數,
matlab會為每個函數生成一個對應的hpp和cpp文件,必須將他們都拷貝你的工
程中去。另外fork_2()之前的三行代碼和之后的四行代碼必不可少,但應該保
證在你的程序的整個執行過程中他們分別只被調用一次,所以最好將分別他們
放置在程序的初始化函數與程序結束時才調用的做掃尾工作的函數里面)

附錄A:鏈接庫
libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib
sgl.lib libmwsglm.lib libmwservices.lib

附錄B:忽略庫
msvcrt.lib

附錄C: 預處理程序定義
MSVC,IBMPC,MSWIND

附錄D:進一步參考
關于mcc命令的使用參見matlab幫助文件
關于mwArray的數據讀出方式參見matlab在線幫助:
http://www.mathworks.com/access/helpdesk_r12p1/help/
toolbox/mathlib/cppmathug/cppmathug.shtml

“m文件轉化為c/c++語言文件”很簡單,但要在VC中通過編譯連接卻會碰到很多問題,

即使通過了編譯與連接也不保證能正確執行,有時候會遇到很多棘手的麻煩,在我
的另一篇文章(站內有):“分析:解決m程序轉化成cpp程序的編譯問題”中就舉了
一個這樣的例子。在那篇文章里雖然最后靠了幾招“歪門邪道”搞定了那個問題,但
還是可以看出這樣的轉化問題是很麻煩的。
登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP