《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 72910|回复: 17
收起左侧

[教程] [原创]mcc、mbuild和mex命令详解

    [复制链接]
发表于 2009-1-16 10:54:16 | 显示全部楼层 |阅读模式
好多学习MATLAB扩展编程的人经常把这几个命令给搞混淆的,下面我就给大家仔细讲讲,希望呢给大家讲明白!

先简单的说说mcc、mbuild和mex到底怎么回事:
  1. mcc将M文件转换成C/C++文件和相应的MEX包裹文件(需要Matlab编辑器),但在特定条件下可以自动调用mbuild或者mex
  2. mex将C/C++文件(入口函数为mexfunction())编译成MEX(DLL)文件(需要C/C++编辑器)
  3. mbuild将C/C++文件(入口函数为main())生成可独立运行的C应用程序(需要C/C++编辑器)
复制代码
一 mcc命令

Matlab编译器使用mcc命令能将一个M文件翻译成C文件,同时生成一个相应的包裹文件,这个包裹文件包含了编译器产生的代码和它支持的可执行文件类型之间所需的接口。利用改包裹文件提供的接口,生成的C文件能用在任何编译器所支持的可执行文件类型(如MEX文件、EXE文件、DLL文件)中,这些C文件与最终生成的可执行文件是相互独立的。
Matlab编译器(Lcc)在特定的条件下能自动调用mex和mbuild函数,尤其是mcc –x/-m/-p时。

(1)创建MEX文件
>>mcc –x filename (注意这个命令在2008a中已经去掉了)将M文件filename.m翻译成C代码,并生成一个可被Matlab直接调用的C的MEX。

(2)创建Simulink S函数
>>mcc –s filename
将M文件filename.m翻译成C代码,并生成一个相应的simulink S函数,该函数的输入输出变量的大小可动态改变。

(3)创建可独立执行的C程序
>>mcc –m filename
将M文件filename.m翻译成C代码,生成的可执行文件能独立于Matlab运行环境。

(4)创建可独立运行的C++程序
>>mcc –p filename
将M文件filename.m翻译成C++代码,生成的可执行文件能独立于Matlab运行环境。

(5)创建可独立运行的C图形库函数
>>mcc –B sgl filename
如果filename.m中包含了对Matlab图形处理函数的调用,上述命令,将filename转换成为C语言,并生成一个能独立于Matlab运行环境的可执行程序。

(6) 创建可独立运行的C++图形库函数
>>mcc –B sgl cpp filename
如果filename.m中包含了对Matlab图形处理函数的调用,上述命令,将filename转换成为C++语言,并生成一个能独立于Matlab运行环境的可执行程序。

(7)创建C函数库
>>mcc –m –W lib:libfoo –T link:libfoo.m
创建一个C函数库

二 mex命令

用户可以在Matlab中按简单的M文件语法规则设计出来完成特定计算的算法。然后用Matlab编译器调用mex命令创建C共享库函数(DLL)或C++静态函数库,最后将它们整合到C/C++应用程序中,编译完这些C/C++应用程序,就可以用这些算法来实现特定的计算功能。当然这过程中也隐藏了算法和加快了代码的执行效率。
由于MEX文件执行效率高,故如果有文件重名的话,Matlab将优先调用MEX文件,下面以一个例子说明:
  1. function theimage=gasket(numpoits)
  2. theimage=zeros(1000);
  3. corners=[866 1;1 500;866 1000];
  4. startpoit=[866 1];
  5. therand=ceil(rand(numpoits,1)*3);
  6. for ii=1:numpoits
  7.     startpoit=floor((corners(therand(ii),:)+startpoit)/2);
  8.     theimage(startpoit(1),startpoit(2))=1;
  9. end
  10. imagesc(theimage)
  11. colormap([1 1 1;0 0 0]);
  12. axis equal tight
复制代码
现在直接调用
  1. >> tic ,gasket(5000000);toc
  2. Elapsed time is 7.240129 seconds.
复制代码
接着把它编译成mex文件在调用试试
  1. >>mcc -p gasket;tic ,gasket(5000000);toc
  2. Elapsed time is 1.23861 seconds.
复制代码
12.jpg

三 mbuild命令

要建立独立运行的C应用程序,系统中需要安装Matlab、Matlab编译器、C/C++编译器以及Matlab C/C++数学库函数和图形库函数
Matlab编译器使用mbuild命令可以直接将C/C++源代码编译为独立运行程序,在这些源代码中可以使用Matlab提供的接口来调用Matlab数学库函数。
虽然生成的可执行程序可以脱离Matlab环境运行,但是它需要Matlab C/C++数学库文件或者图形库文件的支持才能运行。但如果C/C++源代码完全是按传统C/C++源代码语法规则编写,没有包含Matlab数学库和图形库的调用,则不仅可以独立与Matlab环境,也不需要那两个库函数的支持。

对于如何在其他环境中运行那个生成的exe文件,大家看看这个帖子:http://www.matlabsky.com/thread-543-1-1.html
  
下面说说一些比较和区别:

1. MEX文件和EXE文件的差别

Mex文件与Matlab解释器在同一个过程空间运行,当用户调用一个MEX文件时Matlab解释器就会动态的连接到MEX文件。
可独立运行的C/C++应用程序(exe)可以独立于Matlab环境而运行,而MEX文件则不行,它需要Matlab的支持。还有EXE中可以调用MEX文件。

2.mex和mbuild编译的C/C++文件的差别

使用mbuild命令编译的C/C++源文件中,必须包含main()函数,它能独立于Matlab运行。而mex命令编译的C/C++源文件中不含main()函数,它是以mexfunction()函数作为入口的,编译后生成的是mex文件,被Matlab调用。

下面是我的一些使用心得

由于真正掌握C/C++接口编程比较麻烦,故对初学者较少直接使用mex命令(花费那么大的精力去学习那些接口技术,接着利用接口技术编写C/C++文件,再使用mex命令来编译它),一般大家都是先写好M文件再使用mcc –x命令让它生成MEX (DLL)文件。但对纯正的C/C++大家却都比较熟悉,故mbuild命令还是有些市场的
发表于 2009-3-6 19:32:43 | 显示全部楼层
dynamic的帖子可谓篇篇精彩哈!
发表于 2009-3-8 23:39:22 | 显示全部楼层

好像mcc 用不成啊

由于数据量太大想用C完成模型的功能,想着用mcc编译下呢,可怎么都不行,好像说是06后的都已经不用了...

[ 本帖最后由 hh03 于 2009-3-8 23:40 编辑 ]
发表于 2009-8-20 22:36:48 | 显示全部楼层
谢谢,讲的很好先学习下
发表于 2009-11-20 14:39:24 | 显示全部楼层
赞一下,
这个论坛要啥分啊币啊啥的?
发表于 2009-11-21 14:57:07 | 显示全部楼层
感觉这个是很久以前的,现在的命令都换掉了吧?
发表于 2009-12-2 19:59:32 | 显示全部楼层
感觉这个是很久以前的,现在的命令都换掉了吧?
发表于 2010-4-9 19:05:10 | 显示全部楼层
我用的是matlab 7.5,vc++6.0,怎么照着步骤做总是出错呢?是不是我安装时漏了些东西?请高手指点一下。
mcc -p tic gasket;tic ,gasket(5000000);toc
??? >>mcc -p tic gasket;tic ,gasket(5000000);toc
    |
Error: Unexpected MATLAB operator
发表于 2010-4-11 19:29:15 | 显示全部楼层
谢谢,讲的很好先学习下
发表于 2010-9-1 02:34:48 | 显示全部楼层
我的matlab2010a, 不知道可不可以,anyway,谢谢楼主
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 蜀ICP备19014457号-2 

GMT+8, 2021-12-3 00:31 , Processed in 0.056745 second(s), 14 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表