VC6.0中调用MATLAB编译生成的DLL2

VC6.0中调用MATLAB编译生成的DLL

       说明:本文是在作者项目中实用的方法,部分来源于互联网,请谅解;尤其值得注意的是,如果出现较多的错误,请检查环境变量设置以及matlab的版本;转载请注明出处,谢谢。

一、Matlab阵列类型mwArray

Matlab C++数学库使用mwArray类,封装了Matlab阵列的数据及其基本操作。Matlab C++数学库支持使用类或者对象mwArray,作为与Matlab所有阵列类型的接口。

1、创建Matlab mwArray阵列  

        有两种主要方式,一种是通过mwArray类的构造函数创建Matlab mwArray阵列;另一种是通过其他函数如rand()等的返回直接创建Matlab mwArray阵列。常见方法如下:

操作代码

说明

mwArray A

直接创建未初始化的阵列

empty()

创建空的阵列

mwArray(double)

创建标量的数值阵列

mwArray(int M,int N,double *data)

创建M*N的矩阵

mwArray(double start,double dis,double end)

创建线性变化的数值阵列

ones()、zeros()、rand()、randn()

全1、全0、随机分布、高斯分布

eye()、magic()

创建单位矩阵和魔方矩阵

2、Matlab mwArray阵列(数据阵列)的操作

数据导入:

1>  调用mwArray的setData函数       

            mwArray data(3,2,mxDOUBLE_CLASS);

           double mData[6] = {1,2,3,4,5,6,};

            data.SetData(mData,3);

2>  直接利用double数组

           double mData[6] = {1,2,3,4,5,6,};

            mwArray data(3,2,mdata);

数据导出:

         double pData[3][2];

          data.getData(*pData,6);


二、解决方案

1. 设置matlab的编译器,使用外部的VC编译器   

       为编译产生的MEX文件进行预配置:在MATLAB的命令窗口输入“mex -setup”,选择对应的编译器。

       为产生独立外部应用程序进行预配置:在MATLAB的命令窗口输入“mbuild -setup”,选择对应的编译器即可。

       注意:如果在配置的过程中无法检测到VC6.0的编译器,需要检查matlab版本。我们采用Matlab R2008b(32bit)

2. 编译m文件生成dll

       在matlab命令窗口输入命令:

Mcc –W cpplib:文件名 –T link:lib 文件名.m –C

      其中:-W是控制编译后的封装格式,cpplib指编译成c++的lib,-T表示目标,link:lib表示要连接到一个库文件的目标,-C指同时生成ctf文件。

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

在VC6.0开发环境中,选择project->settings:

【1】C/C++选项卡:

 category选择Preprocessor项

 Additional include directories中加入:C:\ProgramFiles (x86)\MATLAB\R2008b\extern\include

【2】Link选项卡:

category选择input项

Object/library modules中加入mclmcrrt.lib和uttransform.lib ,各项之间用空格隔开;

Additional include directories中加入:C:\ProgramFiles(x86)\MATLAB\R2008b\extern\lib\win32\microsoft

4. 编写C调用dll


三、实例Test

1、设置matlab的编译器,使用外部的VC编译器;

2、编译m文件生成dll;

M文件:

function C = Add (A , b)
C = A + B
end

上面的代码存到F:\DLL文件夹下,文件名为Add.m。

更改Matlab工作路径并键入编译命令:

>>cd F:\DLL

>>mcc -W cpplib:add -T link :lib Add.m -C

在DLL文件夹下,会生成一系列文件,其中有四个是需要的:“add.ctf"、“add.dll"、“add.h"和“add.lib"。


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

        新建名为DLLTEST的Win32 ConsoleApplication工程。并将刚才生成的“add.dll”、“add.h”和“add.lib”拷贝到该工程目录下,配置环境如下:


4、编写C调用dll

        新建一个C++ SourceFile,命名为Test;在工程中右键点击"Header Files",选择"Add Files to Folder",把“F:\DLL"下的"Add.h"添加进工程。

双击打开"libAdd.h",把代码拖到最后,可以看到这么一行:


可见Add函数在C++中调用和在MATLAB中调用不一样,需要提供4个参数,第一个参数是返回值的个数(本例中只有一个返回值,故为1),第二个到第四个参数则是输出和输入。

在Test.cpp中写入如下代码:

#include "iostream.h"
#include "add.h"

int main()
{
	//初始化lib(必须)
	if (!addInitialize())
		return -1;
	int a = 56, b = 24;
	int c;
	mwArray mwA(1,1,mxINT32_CLASS);
	mwArray mwB(1,1,mxINT32_CLASS);
	mwArray mwC(1,1,mxINT32_CLASS);
	mwA.SetData(&a, 1);
	mwB.SetData(&b, 1);
	Add(1, mwC, mwA, mwB);
	c = mwC.Get(1,1);
	mwC.GetData(&c,1);
	cout<<"c = "<<c<<endl<<endl;
	//终止调用
	addTerminate();
	return 0;
}

说明:初始化lib的代码貌似是必须的,但是终止调用没带太影响,但是一般都会有。

程序运行的结果如下:



至此,所有的步骤均已完成。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值