(个人总结)VC++调用Matlab生成的dll图文详解

来源:互联网 发布:ubuntu 开机任务栏没了 编辑:程序博客网 时间:2024/06/05 06:39
最近在Matlab中写了一个算法,需要封装成dll供VC++调用,按现有帖子的方法没有成功(也许和我的系统环境不同),但经过一番折腾终于搞定,特重写了帖子,与大家交流。

参考资料:
http://developer.51cto.com/art/200909/150944.htm
http://blog.csdn.net/nupt123456789/article/details/7463612

下面开始:

我的系统环境:winXPSP3,VC++6.0,Matlab7.1

(一) 总体概念

matlab提供了丰富的程序接口,除了matlab最初的版本是用fortran写的之外,后来的版本都是用C写的,因此matlab很容易和C/C++联合起来使用。

matlab有着丰富的库函数,将这些库函数直接编译成dll(windows下是dll,linux下是类似于dll的另外一个东西),给C调用,可以加快工程进度。

步骤如下:

1. 设置matlab的编译器,使用外部的VC或者gcc等编译器。

2. 编译m文件成dll

3. 设置VC等的继承环境,设置C需要用到的静态库和动态库

4. 编写C调用dll

下面以一个很简单的加法函数为例,说明在VC6和matlab7.1下,怎么做混合编程。

(二) 设置matlab编译器

过程如下:

1. 在matlab的command window里面敲入mex –setup,matlab会列出所有电脑上所有的编译器。

2. 选择编译器,这里选择3,即VC6



3.完成之后,敲入mbuild –setup,选择build工具,matlab会列出所有的build工具,同样选择VC6



(三) 编译m文件

首先,写出matlab函数,一个很简单的加法函数,如下:

  1. function [c] = MyAdd(a, b);   
  2. c = a + b;  

保存为MyAdd.m

然后,进行编译,命令如下:

mcc -W cpplib:libMyAdd -T link:lib MyAdd

其中,mcc是matlab提供的编译命令(可以理解为gcc),对于这一点,matlab的帮助说明如下:

-W lib:string link:lib

其中-W是控制编译之后的封装格式,cpplib,是指编译成C++的lib,cpplib冒号后面是指编译的库的名字,-T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字是后面的MyAdd,即你写的m函数的名字。

运行完之后,你的目录下面,将会出现以下一些文件:


编译完成之后,libMyAdd.h libMyAdd.lib libMyAdd.dll和libMyAdd.ctf这四个文件时我们在c++中调用所需要的;

具体每一个文件的意思,请查帮助,这里只说其中很有用的几个:

libMyAdd.dll是编译好的动态库,MyAdd这个函数封装在里面,libMyAdd.h是对应的头文件,在C里面调用这个函数的时候,需要include这个头文件,在这个头文件的最后,你可以看到下面的内容:

extern LIB_libMyAdd_CPP_API void MW_CALL_CONV MyAdd(int nargout, mwArray& c

, const mwArray& a

, const mwArray& b);

这就是MyAdd的C函数的声明。

nargout表示输出变量的个数

a,b,c就是对应了m函数的几个变量

注意,a,b,c三个变量的类型是mwArray,这是matlab提供的一个特殊的变量类型。mwArray是一个类,具体可以查帮助。

(四) 设置VC环境

有了上面的准备,需要设置VC环境。

1. 首先建立一个控制台空工程(这个就不详细讲了,太easy了)

2. 将matlab的头文件路径和对应的库文件路径包含到VC++6.0;在VC++6.0中,点‘工具’->‘选项’,然后在‘目录’选项卡中,将‘Include files’的最后一行,添加matlab相关的头文件;如我的matlab对应的路径为:C:\matlab71\extern\include(这个根据每一个人的安装目录可能不一样,自己去找吧),如下图



将下拉框换为‘Library files’,将matlab相关的静态链接库的路径加入其中,我的是:C:\matlab71\extern\lib\win32\microsoft\MSVC71 ,如下图


还要把Matlab编译生成的lib路径加入其中,如下图:



3、添加main.cpp文件,并添加必须的头文件和静态链接库

3.1、在工程中添加main.cpp文件,并按下图添加相关文件



3.2、将matlab编译生成的libMyAdd.h libMyAdd.lib libMyAdd.dll和libMyAdd.ctf这四个文件拷贝到VB工程目录下,并将头文件和静态链接库添加到工程中,添加方法如下图:



3.3、添加C++基本文件



4、编写main函数,如下图:


 
5、编译后运行程序,结果如下:





6、关于mwArray类

从上面的程序我们可以看出,c++与matlab函数数据传递是借助matlab定义的mwArray类完成的!该类支持的数据类型有:
/*typedef enum
    {
    mxUNKNOWN_CLASS = 0,
    mxCELL_CLASS,
    mxSTRUCT_CLASS,
    mxLOGICAL_CLASS,
    mxCHAR_CLASS,
    mxVOID_CLASS,
    mxDOUBLE_CLASS,
    mxSINGLE_CLASS,
    mxINT8_CLASS,
    mxUINT8_CLASS,
    mxINT16_CLASS,
    mxUINT16_CLASS,
    mxINT32_CLASS,
    mxUINT32_CLASS,
    mxINT64_CLASS,
    mxUINT64_CLASS,
    mxFUNCTION_CLASS,
    mxOPAQUE_CLASS,
      mxOBJECT_CLASS}*/
同时我们应注意:mwArray类定义的对象数组,其坐标仍然是从1开始,而不是像c++那样,从0开始!mwArray的更详细的用法,可以参看mclcomclass.h
0 0
原创粉丝点击