MATLAB程序如何编译产生DLL?

MATLAB程序如何编译产生DLL?,第1张

把一个简单的m代码编译成C++接口的DLL,然后在C++程序中调用。为了简单起见,这里的C++程序是一个Win32 Console程序,而不是Windows图形界面的程序,不过不妨碍我们的讨论。

下面是这个例子用到的m代码。它定义了一个名为myadd2的函数

function [y,z] = myadd2(a, b)

% dummy function, just to demonstrate the idea

y = a+b

z = a+2*b

end

复制代码

首先把这个函数编译成C++接口的DLL。为此,我们需要先设置MATLAB编译器。具体做法是在MATLAB命令行执行“mbuild -setup”。然后用下面这行命令把myadd2函数编译成一个C++接口的DLL:

mcc -W cpplib:libmyadd2 -T link:lib myadd2

复制代码

结果,我们将会得到包含libmyadd2.dll,libmyadd2.ctf,libmyadd2.h,libmyadd2.lib等在内的一些文件。接下来我们只需要这四个文件。

然后在VS2005中创建一个Win32 Console的VC++工程,我在测试时取名为testmyadd2_r2007b。把以上四个文件拷贝到VC++工程的源代码所在目录。

接下来设置VC++,让它能找到MATLAB接口函数的定义及连接库函数。可以有两种设置方式:一种是改VS2005中关于VC++的设置,这样的好处是每个新的工程都能自动获得这个设定;而另一种是只改当前工程的设置,也就是设置只对该工程有效。这里用后一种方式。

在VS2005中打开工程testmyadd2_r2007b,选择菜单“Project-->Properties,在出来的对话框上,把MATLAB提供的include路径加到VC++的头文件搜索路径。

然后把相应的lib所在目录加到linker的额外搜索路径上

接下来,告诉VC++,我们的这个程序需要连接到另外两个额外的库函数:libmyadd2.lib和mclmcrrt.lib。中间用空格隔开

最后则是程序代码。这个程序只有一个main函数,其完整代码附在下面给大家参考。

#include "stdafx.h"

#include <iostream>

#include "mclmcr.h"

#include "mclcppclass.h"

#include "libmyadd2.h"

int _tmain(int argc, _TCHAR* argv[])

{

std::cout <<"Hello world!" <<std::endl

/* Initialize the MCR */

if( !mclInitializeApplication(NULL,0) )

{

std::cout <<"Could not initialize the application!" <<std::endl

return -1

}

// initialize lib

if( !libmyadd2Initialize())

{

std::cout <<"Could not initialize libmyadd2!" <<std::endl

return -1

}

try

{

// declare and initialize a

mwArray a(2, 2, mxDOUBLE_CLASS)

double *aData

aData = new double[4]

复制代码

本帖隐藏的内容

int i

for( i=0i<4++i)

{

aData = 1.0*i

}

// print output

std::cout <<"a = " <<std::endl

std::cout <<aData[0] <<",\t" <<aData[1] <<std::endl

std::cout <<aData[2] <<",\t" <<aData[3] <<std::endl

a.SetData(aData, 4)

// declare and initialize b

mwArray b(2, 2, mxDOUBLE_CLASS)

b(1,1) = 11.

b(1,2) = 12.

b(2,1) = 21.

b(2,2) = 22.

mwArray y(2, 2, mxDOUBLE_CLASS)

mwArray z(2, 2, mxDOUBLE_CLASS)

// call the function

myadd2(2, y, z, a, b)

// copy data from mwArray to C++ objects

// allocate outputs

double *yData, *zData

yData = new double[4]

复制代码

if( yData == NULL )

{

std::cout <<"Failed to allocate memory for yData!" <<std::endl

return -1

}

zData = new double[4]

if( zData == NULL )

{

std::cout <<"Failed to allocate memory for zData!" <<std::endl

return -1

}

// copy data from mwArray to C++

y.GetData(yData, 4)

z.GetData(zData, 4)

// print output

std::cout <<"y = " <<std::endl

std::cout <<yData[0] <<",\t" <<yData[1] <<std::endl

std::cout <<yData[2] <<",\t" <<yData[3] <<std::endl

std::cout <<"z = " <<std::endl

std::cout <<zData[0] <<",\t" <<zData[1] <<std::endl

std::cout <<zData[2] <<",\t" <<zData[3] <<std::endl

// deallocate memory

delete [] aData

delete [] zData

delete [] yData

}

catch( const mwException&e)

{

std::cerr <<e.what() <<std::endl

}

// terminate the lib

libmyadd2Terminate()

// terminate MCR

mclTerminateApplication()

return 0

}

matlab下生成的dll实际上还是com控件,可以自动生成注册文件,运行即可注册。我实际使用了,发现存在2个问题:

1、速度很慢;

2、数组类型不工作;只可以在参数为数字时候正确。

2006a版本以前可以输入comtool,即可。

在2006a版本以后,就是输入:dotnettool,然后d出一个对话框的生成东西,只要简单的配置,就可以了,或者在matlab的帮助文件里面输入dotnettool。

在编写好S函数的实现代码*.c文件后,还需要在Matlab的命令输出窗口中进行命令行输入,完成对源代码的编译,这样才能被S函数模块所调用。在命令窗口中输入命令:

“mex

-g

RandomTimeDelay.c”

M文件S-函数在MATLAB环境下可以通过解释器直接执行,而C文件或其它语言编写的C-函数,则需要先编译成可以在MATLAB内运行的二进制代码:动态连接库或静态连接库,然后才可以使用,这些经过编译的二进制文件就称作MEX文件。用MEX命令来对*.c文件进行编译,然后会在相应的目录下生成对应的*.mexw32文件。然后就可以在simulink模块中引用这个s函数了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/7977828.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-12
下一篇 2023-04-12

发表评论

登录后才能评论

评论列表(0条)

保存