如何vs2010mfc调用matlab生成dll进行编程

如何vs2010mfc调用matlab生成dll进行编程,第1张

首先matlab要安装64位的,一般在64位系统下默认安装64位。

在Matlab中运行mbuild -setup,选择64位的编译器。这个要配合vs2010的安装进行,vs2010中需要有64的编译器。

首先,写一个很简单的加法函数

function [c] =Add(a, b);

c = a + b;

保存为Addm

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

mcc -W cpplib:libAdd -T link:lib Add

其中,mcc是matlab提供的编译命令,此命令的帮助说明如下:

-W lib:string link:lib

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

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

libAddcpp

libAddlib

libAdddll

libAddh等

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

externLIB_libAdd_CPP_API void MW_CALL_CONV Add(int nargout, mwArray& c

, const mwArray&a

, constmwArray& b);

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

nargout表示输出变量的个数

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

注意,a,b,c三个变量的类型是mwArray,这是matlab提供的一个特殊的变量类型(在70的版本,编译之后,变量类型是mxArray)。

把一个简单的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+2b;

end

复制代码

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

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

复制代码

结果,我们将会得到包含libmyadd2dll,libmyadd2ctf,libmyadd2h,libmyadd2lib等在内的一些文件。接下来我们只需要这四个文件。

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

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

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

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

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

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

#include "stdafxh"

#include <iostream>

#include "mclmcrh"

#include "mclcppclassh"

#include "libmyadd2h"

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=0; i<4; ++i)

{

aData = 10i;

}

// 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;

aSetData(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++

yGetData(yData, 4);

zGetData(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 << ewhat() << std::endl;

}

// terminate the lib

libmyadd2Terminate();

// terminate MCR

mclTerminateApplication();

return 0;

}

以上就是关于如何vs2010mfc调用matlab生成dll进行编程全部的内容,包括:如何vs2010mfc调用matlab生成dll进行编程、如何将MATLAB程序编译产生DLL、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/10142631.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存