鹰击长空,拼搏吧!!! 态度决定成败!分享 http://blog.sciencenet.cn/u/eaglezxw 邹兴文,工学硕士,甘肃漳县人,计算机视觉入门者,算法工程师

博文

在VC6.0下调用Matlab的m文件

已有 6626 次阅读 2010-2-21 15:51 |个人分类:matlab开发|系统分类:科研笔记|关键词:学者| m文件

一、Matlab编译环境的设置

       matlab编译环境的配置如下:

为了在开发时实现对MATLAB的具体功能的调用,应首先在操作系统中安装MATLAB工具软件,之后并运行此工具软件,依次执行“mex –setupmbuild –setupcd(prefdir);  mccsavepath; ”命令。

二、创建动态链接库(*.DLL

创建动态链接库主要有两种方法:

一种是使用 MatlabVC++ IDE提供的Add-in。这种方法比较简单,方便快捷,只要 VC++中创建工程的时候选择Matlab Project Wizard,并且在接下来的Step1中的Visual Matlab Application Type 选择 Shared M-DLL就可以了。接下来就是添加*.m文件, 进行编 了。

另一种方法就是使用Matlabmcc命令将*.m文件编译为动态链接库(*.DLL)。

 

mccB csglsharedlib: youlibname function1 funcion2…来创建我们所需要的动态链接库 DLL文件。其中参数-B表示使用的是Bundle Files作为参数,csglsharedlib-B的参数,意 思是生成使用Matlab图形库的C共享动态链接库,youlibname是你想要生成的动态链接库 DLL的文件名,注意csglsharedlibyoulibname之间有一个冒号“:”连接,function1为你想要加入到动态链接库DLL中的函数名,如果有多个函数,各个函数名用空格隔开。

举例:创建所需的Matlab函数文件 myfun.m

function y=myfun(timeend)

t=0:0.001:timeend;

y=sin(2*pi*50*t);

plot(y);

然后使用命令mcc -B csglsharedlib:mylib myfun 生成动态链接库DLLMatlab会生成

件, 其中 mylib.h  mylib.lib  mylib.dll 以及 同目 bin FigureMenuBar.fig FigureToolBar.fig是我们在以后所需要使用的。

 

三、在VC++中使用Matlab生成的动态链接库(*.DLL

       1、设置 Include Library 目录

VC++IDE中选择Tools->Options->Directories

Show directoris for:中选择Include files,添加如下两个目录:

<Matlab>externinclude

    <Matlab>externincludecpp

Show directoris for:中选择Library files,添加如下两个目录:

    <Matlab>externlibwin32

    <Matlab>externlibwin32microsofmsvc6

这里假设<Matlab>为你的Matlab的安装目录。这些操作只需要一次。以后的工程中不需再进行操作。

       2、工程 (project)本身的一些设置 

1)、在 VC++ IDE 选择 Project->Setting->C/C++

Category中选择Code Generation,在Use run-time library中选择 Multithreaded DLL

Category中选择Precompiled Headers,选择Automatic use of precompiled headers,并且在Through header下面添加stdafx.h

Category中选择Preprocessor,在preprocessor  definitions中添加MSVC, MSWIND, IBMPC 

2)、在VC++ IDE中选择 Project->Settings->Link

Categories中选择Input,在Ignore libraries:中填入:msvcrt.lib 

       3、为工程添加相应的文件

把刚才生成的mylib.h mylib.dll mylib.lib<Matlab>externlibwin32下的libmatpm.lib

<Matlab>externlibwin32microsofmsvc6 下的所有*.lib文件复制到VC++工程的文件夹下,并且用add to project//files 添加的工程中。

       4、使用DLL

1)、首先要在使用DLL中函数的源文件中加上头文件mylib.h

2)、注册DLL

在使用之前还需要对mylib.dll进注册,使用完毕之后需要对其进行释放。注册使用函数mylibInitiallize();释放使用函数mylibTerminate()

函数名的规则就是youlibname+Initialize(Terminate) 这两函数在mylib.h 中可以找到。

mylibInitialize()不仅注册了刚才生成的mylib.dll,同时它也注册了Matlab本身的一些动态链接库(*.DLL);同理mylibTerminate()不仅释放了刚才生成的mylib.dll,同时它也释放了Matlab本身的一些动态链接库(*.DLL)。因此在注册了mylib.dll之后,我们也可以使用 Matlab的数学库中的函数,例如mlfabs()mlfAssign()等等  

在使用mylib.dll 的时候,存在着一个VC++mylib.dll中的函数之间数据交互的问题

由于mylib.dll中的函数所接受的参数是mxArray 型数据 。因此我们要使用Matlab 我们提供的External Interfaces/ API 函数来创建mxArray 型数据,大量的API函数可以参见Matlab 的帮助文件MatlabExternal Interfaces/API ReferenceC MX-Functionsx 小节 。还有一个需要注意的问题就是原来的函数名myfun 变成了mlfMyfun。可以在mylib.h中看到。

 

就是一个  

//包含头文件 

#include “mylib.h” 

/注册动态链接库 

mylibInitialize()   

double x=0.04;

//创建 mxArray 型数据并对其赋值 

mxArray *t;

 

t=mxCreateDoubleMatrix(1,1,mxREAL);  

memcpy(mxGetPr(t), &x,sizeof(double));  

//或者使用 t=mxCreateDoubleScalar(x)

//或者使用Matlab数学库中的函数mlfAssign() 

 

//使用 mylib.dll 中的函数

mlfMyfun(t);      

//销毁t,释放内存 

mxDestroyArray(t);

//注销动态链接库 

mylibTerminate();

 

很好的资料,感谢作者,

参考资料:

[1] Matlab Compiler

[2] Matlab COM Builder

[3] 刘建伟,VC++Matlab混合编程的快速实现。



https://m.sciencenet.cn/blog-379528-296508.html

上一篇:冬奥第三金——女子短道1500米周洋夺冠
下一篇:CPen::CreatePen 函数

0

发表评论 评论 (1 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-3 14:30

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部