vs2010调用matlab2011下的.m文件

很幸运在网上找到了采用引擎的方法,用vs2009调用matlab2008下的.m文件;但个人的环境是vs2010+matlab2011;想着二者差不多,故将s2010调用matlab2008拿来试试;

实验环境:

Win7

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 ideay = a+b;z = a+2*b;end

/////////////////////////////////////

在MATLAB命令框中输入以下命令:

mcc -W cpplib:libmyadd2 -T link:lib myadd2.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
#include "mclmcr.h"
#include "mclcppclass.h"
#include "libmyadd2.h"
/////////////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "Hello world!" << std::endl;
// 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[i] = 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;}
时间: 2024-10-13 20:18:19

vs2010调用matlab2011下的.m文件的相关文章

使用VS2010调用matlab的mat格式文件

做实验需要将matlab实现的meanshift的结果中的region的Iabels矩阵,需要把labels.mat读入VS2010中,实现功能,在此把实现过程记录下来. C++读取mat文件的步骤如下. 1. vs2010的配置 新建一个工程,在属性管理器中选择 工程->属性->VC++目录. 设置包含目录为:D:\MATLAB\R2010a\extern\include(我的matlab装在D盘): 设置库目录为:D:\MATLAB\R2010a\extern\lib\win32\micr

ubuntu下用java代码调用命令将java格式文件转换为html格式文件

首先我们应该在电脑上装上GNU Source-highlight 3.1.7,给个链接参考: http://www.gnu.org/software/src-highlite/#mozTocId120994 下面代码实现了 将java类型的代码转换为html文件类型的代码,如果java代码的文件名为 helloword.java,则转换为html格式的文件名为helloword.java.html,将java代码在浏览器上显示出来.其次我还将html文件中的内容提取出来,便于在html文件里编写

vs2010环境下生成dll文件

vs2010环境下生成dll文件 1,新建win32工程,选中DLL项目,如下图:2,分别添加头文件和cpp文件 #ifndef LIB_H#define LIB_Hextern "C" int _declspec(dllexport)add(int x,int y);    // 声明为C编译.链接方式的外部函数#endif #include "stdafx.h"int add(int x,int y){    return x+y;} 3,新建win32控制台工

VS2010 C++环境下DLL和LIB文件目录及名称修改

DLL工程,Debug版本下输出文件由basetool.dll basetool.lib 改为basetoolD.dll basetoold.lib 需设置: 1.配置属性-常规-目标文件名 $(ProjectName) 加d 2.配置属性-连接器-常规-输出问件 由 加d 3.配置属性-连接器-高级-导入库,设置文件名$(OutDir)$ProjectName)d.lib 4.如果有导出文件,.def文件中也一定要修改导出库的名字 LIBRARY      "BaseTool" 变为

VC6.0编译DLL,使用VS2010调用问题及解决方法

1.做驱动的时候,做应用程序需要和驱动通信,必须建立一个DLL. 2.因为客户使用版本太低,需要使用到VC6.0编写DLL 3.在VC6.0上编写DLL的时候,导出的函数名会出现和原函数名不对,导致调用失败 4.解决办法, 找到VC6.0工程下面的文件   ***.DEF. 把里面的   LIBRARY  后面输入要导出的DLL的文件名.如: LIBRARY      "pc104dll" 在EXPORTS后面输入要导出的函数名,整个文件内容入下: LIBRARY      "

如何遍历文件夹下上亿文件而不溢出(转载)

序:一个文件夹下面有很多层的小文件,如何算出这个文件夹下面有多少文件?递归遍历,简单暴力,递归在一般情况确实是比较方便的解决方案,但是当文件夹深度多深,递归的反复调用会导致方法一直无法释放,造成jvm的栈溢出.那我们该怎么办? 原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6031894.html 新浪微博:intsmaze刘洋洋哥 微信:intsmaze 说实话这个问题我以前也没有遇到过,我是听一位我很敬佩的IT前辈讲的他曾经的面试经历.他说他当时比较

如何遍历文件夹下上亿文件而不栈溢出

序:一个文件夹下面有很多层的小文件,如何算出这个文件夹下面有多少文件?递归遍历,简单暴力,递归在一般情况确实是比较方便的解决方案,但是当文件夹深度多深,递归的反复调用会导致方法一直无法释放,造成jvm的栈溢出.那我们该怎么办? 原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6031894.html 新浪微博:intsmaze刘洋洋哥 微信:intsmaze 说实话这个问题我以前也没有遇到过,我是听一位我很敬佩的IT前辈讲的他曾经的面试经历.他说他当时比较

(转)Unity Assets目录下的特殊文件夹名称

原文:http://wiki.unity3d.com/index.php/Special_Folder_Names_in_your_Assets_Folder 1.隐藏文件夹以.开头的文件夹会被Unity忽略.在这种文件夹中的资源不会被导入,脚本不会被编译.也不会出现在Project视图中.2.Standard Assets在这个文件夹中的脚本最先被编译.这个文件夹中的脚本会被导出到Assembly-CSharp-firstpass, Assembly-UnityScript-firstpass

C# vs2010 调用webservice

如何调用已经发布的webservice,主要分为2个步骤(vs2010环境 C#) 发布webservice,使其处于服务状态. 创建一个asp.net程序(java等也可以),对webservice的方法进行调用. 发布webservice,可以参见 http://mingsuper.blog.51cto.com/8269088/1439419 创建asp.net 1)创建空的asp.net程序 2)建立测试用的页面,这里不过多叙述 3)增加对webservice的web 引用,在工程上点击右