实验环境:
window XP
MATLAB 2009b(安装路径:E:/Program Files/MATLAB/R2009a)
VS2008 中文版(安装路径:E:/Program Files/Microsoft Visual Studio 9.0)
1.Matlab 生成DLL
1.1编译器的安装
在matlab中先安装编译器,我在第一次安装的时候一路y下来,只有一个compiler,还是最老的。这教育我们要学会说N,按照以下步骤操作
>> mbuild -setup
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n? n
Select a compiler:
[1] Lcc-win32 C 2.4.1
[2] Microsoft Visual C++ 6.0
[3] Microsoft Visual C++ .NET 2003
[4] Microsoft Visual C++ 2005 SP1
[5] Microsoft Visual C++ 2008 Express
[6] Microsoft Visual C++ 2008 SP1
[0] None
Compiler: 6
The default location for Microsoft Visual C++ 2008 SP1 compilers is C:/Program Files/Microsoft Visual Studio 9.0,
but that directory does not exist on this machine.
Use C:/Program Files/Microsoft Visual Studio 9.0 anyway [y]/n? n
Please enter the location of your compiler: [C:/Program Files/Microsoft Visual Studio 9.0] e:/Program Files/Microsoft Visual Studio 9.0
(红色部分换成你的vs所安装的地址)
Please verify your choices:
Compiler: Microsoft Visual C++ 2008 SP1
Location: e:/Program Files/Microsoft Visual Studio 9.0
Are these correct [y]/n? y
****************************************************************************
Warning: Applications/components generated using Microsoft Visual Studio
2008 require that the Microsoft Visual Studio 2008 run-time
libraries be available on the computer used for deployment.
To redistribute your applications/components, be sure that the
deployment machine has these run-time libraries.
****************************************************************************
Trying to update options file: C:/Users/Administrator/AppData/Roaming/MathWorks/MATLAB/R2009a/compopts.bat
From template: E:/PROGRA~1/MATLAB/R2009a/bin/win32/mbuildopts/msvc90compp.bat
Done . . .
1.2 DLL的生成
首先新建一个m文件,文件名为myadd2.m,定义了一个名为myadd2的函数,代码如下:
function [y,z] = myadd2(a, b)
% dummy function, just to demonstrate the idea
y = a+b;
z = a+2*b;
end
在MATLAB命令框中输入以下命令:
mcc -W cpplib:libmyadd2 -T link:lib myadd2.m
在默认路径下(存放对应.m文件)生成libmyadd2.lib, libmyadd2.h, libmyadd2.dll 等文件,将这三个文件拷到VS的项目目录下。
2. VS调用DLL
2.1 新建一个项目,并设置环境
新建一个win32 控制台应用程序,取名字是matlabDll2.当然新建其他的项目类型也可以,这只是个例子。接下来进行配置,在该项目的属性中进行了配置,只对该项目有效。若建新的项目需要重新配置。项目建好后将libmyadd2.lib, libmyadd2.h, libmyadd2.dll拷贝到项目目录下。
首先配置项目属性页/配置属性/C-C++/常规/附加包含目录,请根据自己电脑上软件的安装位置对照设置,2008与2005不同的地方时这里要加两个目录,如下图所示:
其次配置项目属性页/配置属性/链接器/常规/附加库目录,请根据自己电脑上软件的安装位置对照设置,如下图所示:
然后配置项目属性页/配置属性/链接器/输入/附加依赖性,填入libmyadd2.lib mclmcrrt.lib mclmcr.lib ,如下图所示:
还有其他的一些包含lib,比如libmex.lib libmx.lib ,这里没填,好像是VC6上要配的。配置到此结束。
2.2 编写主程序,调试运行
这段代码是从别处拷来的,是一段完整代码,将它粘到matlabDLL2.cpp 主CPP文件中,调试通过:
#include "stdafx.h"
#include <iostream>
#include "mclmcrrt.h"
#include "libmyadd2.h"
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << " function [y,z] = myadd2(a, b) " << std::endl;
std::cout << " y = a+b; " << std::endl;
std::cout << " z = a+2*b; " << '\n' << std::endl;
// 初始化MCR
if( !mclInitializeApplication(NULL,0) )
{
std::cout << "Could not initialize the application!" << std::endl;
return -1;
}
// 初始化引用
if( !libmyadd2Initialize())
{
std::cout << "Could not initialize libmyadd2!" << std::endl;
return -1;
}
try
{
//初始化 a
mwArray a(2, 2, mxDOUBLE_CLASS);
double *aData,*bData;
aData = new double[4];
bData = new double[4];
for( int i=0; i<4; ++i)
{
aData[i] = 1.0*i;
}
std::cout << "a = " << std::endl;
std::cout << aData[0] << "," << aData[1] << std::endl;
std::cout << aData[2] << "," << aData[3] << '\n' << std::endl;
a.SetData(aData, 4);
//初始化 b
mwArray b(2, 2, mxDOUBLE_CLASS);
b(1,1) = 11.;
b(1,2) = 12.;
b(2,1) = 21.;
b(2,2) = 22.;
b.GetData(bData, 4);
std::cout << "b = " << std::endl;
std::cout << bData[0] << "," << bData[1] << std::endl;
std::cout << bData[2] << "," << bData[3] << '\n' << std::endl;
//定义输出 y z
mwArray y(2, 2, mxDOUBLE_CLASS);
mwArray z(2, 2, mxDOUBLE_CLASS);
// 调用dll
myadd2(2, y, z, a, b);
double *yData, *zData;
yData = new double[4];
zData = new double[4];
// 拷贝数据到 C++
y.GetData(yData, 4);
z.GetData(zData, 4);
// 输出结果
std::cout << "y = " << std::endl;
std::cout << yData[0] << "," << yData[1] << std::endl;
std::cout << yData[2] << "," << yData[3] << '\n' << std::endl;
std::cout << "z = " << std::endl;
std::cout << zData[0] << "," << zData[1] << std::endl;
std::cout << zData[2] << "," << zData[3] << std::endl;
// 释放内存
delete [] aData;
delete [] zData;
delete [] yData;
}
catch( const mwException& e)
{
std::cerr << e.what() << std::endl;
}
// 结束 lib
libmyadd2Terminate();
// terminate MCR
mclTerminateApplication();
return 0;
}
运行效果如下:
问题
1 .创建状态链接库(在matlab中使用mcc命令):
mcc -C -W cpplib:libinverse -T link:lib inverse.m
这里加了一个-C,这是因为在matlab2008中使用mcc -W cpplib:libinverse -T link:lib inverse.m.的时候,只会生成.lib .h .dll文件(注意,这四个文件的默认生成位置是:桌面。。\My Documents\MATLAB文件夹中),但并不会生成.ctf文件,那是因为matlab2008默认地把ctf文件放到别的文件中了,所以没有单独生成(你可以用mcc ?查一下),如果想要单独生成ctf文件,可以在里面加上-C这个选项,如上所示。
2 .有可能出现'mclInitializeApplication_proxy': identifier not found,错误
1. #include "mclmcr.h"改为 #include "mclmcrrt.h"
2. 这是因为头文件的相对位置不对,把调用matlab的driver头文件放在#include "mclcppclass.h"的前边或者不用#include "mclcppclass.h",因为它就包含在调用matlab的driver头文件中。
3 .
开始第一次加载,效率慢的吓人,等了大概5秒,还以为程序死循环了,起码证明是动态引用。解决办法还没找到。附件中是编译后的matlab dll。
分享到:
相关推荐
阐述vs2008如何调用matalb2009b生成的DLL的文档,自己摸索的经验,供大家参考
详细讲解了matlab2009b 生成dll文件的过程,并且有vc++2008调用的实例,
阐述vs2008如何调用matalb2009b生成的DLL的文档,自己摸索的经验,供大家参考
《MATLAB 2009b 从入门到精通》 最新英文版教程
为word文档 里面包含了下载地址 及安装全过程 下载并安装成功的记得留言啊 谢谢大家支持!!!!!!!!!
[isoHunt] Matlab_R2009b_-TBE.5087882.TPB.torrent Matlab R2009b下载种子
verycd上TBE的matlab R2009b激活文件只能使用到2017年。提供的激活文件可以使用到2037年(2037后需要系统支持)。
matlab 2009b crack 請參照read me 文件
Mexcdf 格式文件的Matlab工具包,支持 Matlab 2009b 的最新版本
基于simulink的飞轮储能发电系统仿真,matlab2009b~matlab2013b范围版本测试
把09b和12b的破解文件都放一块了,matlab R2009b 2012b 破解文件
Matlab矩阵实验室r2009b下载地址。将txt文档中代码复制到迅雷或者电驴中即可下载。速度很快。
matlab r2009b licesen,这个事standalone的lic文件,在安装的时候注意选择
MATLABr2009b和MATLABr2010a都存在一个bug,在使用联网时,不能打开图形界面,包括卸载时也一样,空占50%的cpu资源,使用这个方法可以轻松解决这个问题,方便实用。
本压缩文件包括《Matlab R2009b与MSVC 2008混合编程》PDF文件和相应的源代码。 内容为本作者原创的关于C++中调用Matlab函数的方法的教程,包括mcc编译器的配置和使用,Visual C++的配置,以及程序运行需要注意的...
三电平svpwm逆变器仿真(matlabr2009b)补充说明,日前有同学对之前提交的三电平svpwm逆变器仿真(matlabr2009b)这一资源模型中pulse generator模块存在疑惑。模块中【0 0 1 1】、【0 1 1 0】、【1 1 0 0】三个矢量的...
C#调用Matlab(R2009b)COM组件。如果不能正常运行,可能是由于没有安装MCR 7.11,读者可以打开readme.txt 查看相关的信息。
该文件可有效解决matlab2009由于时间问题而导致的软件安装频繁解决现象,只需要将文件拷贝到安装目录中license文件夹下即可解决问题
『转』DSP Builder 9.1在Matlab R2009b下安装问题.txt