VC++中调用MATLAB *.m函数编译后的动态链接库

      作为MATLAB的初学者,我最近在看如何实现MATLAB与VC的混合编程,查了不少资料,也借鉴了网上很多的宝贵经验和建议,现我把这份集合大家集体智慧的过程写下来,供大家参考,以希望能和高手多多交流。

 

      软件版本:MATLAB 7.0  VC 6.0

 

      1. 进行MATLAB C/C++编译器的设置

 

>>mbuild -setup
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n?
Select a compiler:
[1] Lcc C version 2.4 in D:/MATLAB7/sys/lcc
[2] Microsoft Visual C/C++ version 6.0 in C:/Program Files/Microsoft Visual Studio
[0] None
Compiler:
2
Please verify your choices:
Compiler: Microsoft Visual C/C++ 6.0
Location: C:/Program Files/Microsoft Visual Studio
Are these correct?([y]/n):
y
Try to update options file: C:/Users/peng/Application Data/MathWorks/MATLAB/R14/compopts.bat
From template:             

D:/MATLAB7/BIN/WIN32/mbuildopts/msvc60compp.bat  
Done . . . 
--> "D:/MATLAB7/bin/win32/mwregsvr D:/MATLAB7/bin/win32/mwcomutil.dll"
DllRegisterServer in D:/MATLAB7/bin/win32/mwcomutil.dll succeeded
--> "D:/MATLAB7/bin/win32/mwregsvr D:/MATLAB7/bin/win32/mwcommgr.dll"
DllRegisterServer in D:/MATLAB7/bin/win32/mwcommgr.dll succeeded

[注意]:我之前没有设置成功是由于我的VC装在了D盘中,后来把VC重装了一遍,放在C盘就可以了

 

2.  编写MATLAB的*.m文件

     比如:

function y =E1(x)
y=x.*x-2*x+x.*x.*x;
plot(x,y);

 

3.  将*.m文件编译成VC可以调用的DLL

     >>mcc -W libhg:<自己定义的库文件名字,如E1DLL> -T link:lib E1(m文件的名字).m

     完成上面的命令就生成了一系列文件,其中有用的是:E1DLL.lib,E1DLL.h E1DLL.dll,E1DLL.crf,将上述文件拷到当前VC的工作目录下。

 

4. 设置VC的环境

 

  •  Tool->Options->directories里: include files 要添加<matlab>/EXTERN/INCLUDE  <MATLAB>/EXTERN/INCLUDE/CPP;
    library files要增加<MATLAB>/EXTERN/LIB/WIN32/MICROSOFT/MSVC60 。
  • project->setting->links中: object/library modules中添加mclmcrrt.lib和本工程的中的lib文件:E1DLL.lib。
  •  

    5.   在VC中调用DLL

         几个关键函数:

         //初始化: 

    res=E1DLLInitialize();
     if(!res)
     {
      MessageBox("初始化Lib错误!");
     }

     

    //析构函数

    E1DLLTerminate();

     

    //调用计算

    double x =0.4;  //定义一个变量
     mxArray *t;     //定义输入函数
     mxArray *y;    //定义输出函数
     y=NULL;
     t=mxCreateDoubleMatrix(1,1,mxREAL);
     memcpy(mxGetPr(t),&x,sizeof(double));
     mlfE1(1,&y,t);  

    //计算的核心函数,“1”表示函数有输出,在E1DLL.h中间中,是自动生成的接口

     mclWaitForFiguresToDie(NULL);//等待图形窗口关闭
     mxDestroyArray(t);
     mxDestroyArray(y);

    [注意]:不要忘了#include “E1DLL.h”

    以上就是我进行的主要过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值