加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

MATLAB混合使用MCC编译器

(2011-12-30 13:35:25)
标签:

杂谈

  1. 我们先说说Mcc编译器,mexmbuild之间的区别

    mccM文件转换成C/C++文件和相应的MEX包裹文件(需要Matlab编辑器)在特定条件下可以自动调用mbuild或者mexmexC/C++文件(入口函数为mexfunction())编译成MEX(DLL)文件(需要C/C++编辑器)mbuildC/C++文件(入口函数为main())生成可独立运行的C应用程序(需要C/C++编辑器)

  2. MATLAB编译器概述

    MATLAB语言的程序能够被外部的程序调用一般无外乎有两种方法,一是将m文件编译成独立的可执行文件,另一个是将m文件编译成c或则c++语言的动态链接库函数。第二种方法对于某些收到保护的代码不适用,第一种方法没有限制。生成的C或者C++代码,主要是接口函数,他们连接外部程序和编译器产生的代码,进行数据之间的传递。MATLAB编译4.X只产生接口函数,程序的主要功能实现仍然保留在M文件中,已加密的方式打包到一个特殊的压缩文件(CTF文件)中。

  3. MATLAB组件运行环境(MCR

    MCR是一组独立的标准动态链接库文件,它完全支持MATLAB语言,所以可以运行所有支持编译的MATLAB及工具箱命令。

  4. 组件技术支持(CTF

    MATLAB编译器4.X并不是把所有的m文件转变成c或者c++语言,而是只产生必要的接口函数,其余用到的m程序是被加密后封装在一个文件中CTF中。

  5. MCC命令

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

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

    (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函数库

  6. 示例:使用混合编程实现VC中使用MATLAB绘图(VC6MATLAB2011a

    方法一:使用VC调用MATLAB的编译后的库文件

MATLAB程序:一个简单的绘图程序

function mccdemo1()

x = -5 : 0.1: 5;

y = sin(x);

plot(x, y);

ylabel('y');

xlabel('x');

end

开始编译,可以使用命令,也可以使用deploytool,编译命令:mcc -W cpplib:libmccdemo2 -T link:lib mccdemo1.m

建立VC工程

对话框如下图,实现的功能是点击绘图按钮时,绘制MATLAB图形。

几个关键步骤:

在对话的cpp中包含头文件#include "libmccdemo1.h",并将编译后的文件拷贝至VC当前的目录下。

对话框初始化时,增加如下代码:

    BOOL res = FALSE;

    res = mclInitializeApplication(NULL, 0);

    if (!res)

    {

        MessageBox("初始化Application失败");

    }

    res = libmccdemo1Initialize();

    if (!res)

    {

        MessageBox("初始化lib失败!");

    }

对话销毁时,销毁绘图窗口:

    bool res;

    res = mclTerminateApplication();

    if (!res)

    {

        MessageBox("结束程序失败");

    }

    libmccdemo1Terminate();

在工程中连接加上libmccdemo1.lib mclmcrrt.lib 。然后编译通过,也就成功了。

方法二:以上绘图有点不太好看的是图形是MATLAB式样的,且和对话框分离了。要是希望将图形绘制在对话框之上,可以有两种方法。一是将采用剪贴板方法,也就是在对话框的的静态文本中,将图形绘制在静态文本上,这本方法比较麻烦,但是功能可以很灵活。另一种方法是将MATLABfigure属性的toolbarmenubar等都不显示,然后将它移动到MFC的主界面上的一个子窗口中来,这种方法使用简单且较为普遍。

MATLAB程序如下:

function mccdemo3( wndname)

figure('NumberTitle', 'off', 'MenuBar','None', 'ToolBar', 'None','Name', wndname);

x = -5:0.1:5;

y = sin(x);

plot(x,y)

xlabel('x')

ylabel('y')

end

编译命令:

>> mcc -W cpplib:libmccdemo3 -T link:lib mccdemo3.m

建立VC工程如下图,运行图像如右图

一些关键地方,初始对话框,和销毁对话框时如上,包含头文件和拷贝相应的编译编译文件,设置工程

点击测试,发生绘图相应,代码如下:

    char wndName[]= "test";

    mwArray mwWndName(wndName);

    mccdemo3(mwWndName);

    HWND hFig = ::FindWindow(NULL, wndName);

    while( hFig == NULL)

    {

        hFig = ::FindWindow(NULL, wndName);

    }

    ::ShowWindow(hFig, SW_HIDE);

    CRect figure_rect;

    CWnd *myFigure = GetDlgItem(IDC_STATIC);

    myFigure->GetWindowRect(&figure_rect);

    long fig_width = figure_rect.Width();

    long fig_height = figure_rect.Height();

    ::SetParent(hFig, myFigure->GetSafeHwnd());

    long lStyle = ::GetWindowLong(hFig, GWL_STYLE);

    ::SetWindowLong(hFig, GWL_STYLE, lStyle & (~WS_CAPTION)&(~WS_THICKFRAME));

    ::ShowWindow(hFig, SW_SHOW);

     ::SetWindowPos(hFig, NULL, 0, 0, fig_width + 8, fig_height+33, SWP_NOZORDER| SWP_NOACTIVATE);

    //显示窗口

    ::ShowWindow(hFig, SW_SHOW);

    //激活窗口

    ::SetForegroundWindow(this->m_hWnd);

这样绘图给人感觉很美观,要是在没有安装MATLAB的机器上运行这样的混合编程程序是要安装MCR,也就是MATLAB运行环境。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有