Matlab 版 (精华区)

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
标  题: 总结:m文件转化为c/c++语言文件,VC编译
发信站: BBS 哈工大紫丁香站 (Sat Oct 30 17:44:20 2004)

这是以前发的文章,但被版主做成了合集,不能通过作者名字来搜索了,所以,再发一次
,以便于查找。


───────────────────────────────────────
─ 
 fork (撒哈拉沙漠的沙)                于 Thu Dec  4 00:56:56 2003 说道: 


   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程序的编译问题”中就举了 
一个这样的例子。在那篇文章里虽然最后靠了几招“歪门邪道”搞定了那个问题,但 
还是可以看出这样的转化问题是很麻烦的。 

───────────────────────────────────────
─ 

--
我***回心转意,你***决定放弃;
我***那么爱你,你***爱理不理; 
我***为你沦陷,你***装没看见; 
我***为你自尽,你***愣不相信; 
我***为你跳楼,你***也不回头; 


※ 来源:·哈工大紫丁香 http://bbs.hit.edu.cn·[FROM: 202.102.144.37]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:5.675毫秒