fork (撒哈拉沙漠的沙) 於 thu dec 4 00:56:56 2003 說道:
發信人: fork (撒哈拉沙漠的沙), 信區: matlab
標 題: 總結:m檔案轉化為c/c++語言檔案,vc編譯
發信站: bbs 哈工大紫丁香站 (sat oct 30 17:44:20 2004)
這是以前發的文章,但被版主做成了合集,不能通過作者名字來搜尋了,所以,再發一次
,以便於查詢。
───────────────────────────────────────
─ 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中的內容,原來有的內容要保留,並注意用逗號
將它們隔開。再選擇下拉列表的pre***piled 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()之前的三行**和之後的四行**必不可少,但應該保
證在你的程式的整個執行過程中他們分別只被呼叫一次,所以最好將分別他們
放置在程式的初始化函式與程式結束時才呼叫的做掃尾工作的函式裡面)
libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib
sgl.lib libmwsglm.lib libmwservices.lib
附錄b:忽略庫
msvcrt.lib
附錄c: 預處理程式定義
msvc,ibmpc,mswind
關於mcc命令的使用參見matlab幫助檔案
「m檔案轉化為c/c++語言檔案」很簡單,但要在vc中通過編譯連線卻會碰到很多問題,
即使通過了編譯與連線也不保證能正確執行,有時候會遇到很多棘手的麻煩,在我
乙個這樣的例子。在那篇文章裡雖然最後靠了幾招「歪門邪道」搞定了那個問題,但
還是可以看出這樣的轉化問題是很麻煩的。
───────────────────────────────────────
簡化m檔案轉化為c c 檔案,VC編譯
發信人 fork 撒哈拉沙漠的沙 信區 matlab 標 題 簡化m檔案轉化為c c 檔案,vc編譯 發信站 bbs 哈工大紫丁香站 sat jul 31 22 29 48 2004 在本版 總結 m檔案轉化為c c 語言檔案,vc編譯 一文中講到如何將乙個m檔案轉成c cpp檔案並在vc中進行編譯...
將MATLAB的 m指令碼轉化為 exe檔案
在matlab的command視窗執行操作 mbuild setup would you like mbuild to locate installed compilers y n?選擇n 按提示後選擇編譯器 在command視窗編譯待轉換的.m檔案 example.m 執行操作 mcc m exa...
動態檔案轉化為靜態檔案
using system.data.sqltypes using system.data.sqlclient using system.io string title demo stringbuilder sb new stringbuilder 注意這裡使用到了變數 連線資料庫 using sql...