||||
一、Matlab编译环境的设置
对matlab编译环境的配置如下:
为了在开发时实现对MATLAB的具体功能的调用,应首先在操作系统中安装MATLAB工具软件,之后并运行此工具软件,依次执行“mex –setup;mbuild –setup;cd(prefdir); mccsavepath; ”命令。
二、创建动态链接库(*.DLL)
创建动态链接库主要有两种方法:
一种是使用 Matlab为VC++ IDE提供的Add-in。这种方法比较简单,方便快捷,只要 在VC++中创建工程的时候选择Matlab Project Wizard,并且在接下来的Step1中的Visual Matlab Application Type 选择 Shared M-DLL就可以了。接下来就是添加*.m文件, 进行编 译 了。
另一种方法就是使用Matlab的mcc命令将*.m文件编译为动态链接库(*.DLL)。
mcc–B csglsharedlib: youlibname function1 funcion2…来创建我们所需要的动态链接库 DLL文件。其中参数-B表示使用的是Bundle Files作为参数,csglsharedlib是-B的参数,意 思是生成使用Matlab图形库的C共享动态链接库,youlibname是你想要生成的动态链接库 DLL的文件名,注意csglsharedlib与youlibname之间有一个冒号“:”连接,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 生成动态链接库DLL。Matlab会生成
一 系 列 文 件, 其中 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混合编程的快速实现。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-6-3 14:30
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社