很幸运在网上找到了采用引擎的方法,用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 -;
}
try
{ // declare and initialize a
mwArray a(, , mxDOUBLE_CLASS);
double *aData;
aData = new double[];
int i;
for( i=; i<; ++i)
{
aData[i] = 1.0*i;
} // print output
std::cout << "a = " << std::endl;
std::cout << aData[] << ",/t" << aData[] << std::endl;
std::cout << aData[] << ",/t" << aData[] << std::endl;
a.SetData(aData, ); // declare and initialize b
mwArray b(, , mxDOUBLE_CLASS);
b(,) = .;
b(,) = .;
b(,) = .;
b(,) = .;
mwArray y(, , mxDOUBLE_CLASS);
mwArray z(, , mxDOUBLE_CLASS);

// call the function
myadd2(, y, z, a, b); // copy data from mwArray to C++ objects
// allocate outputs
double *yData, *zData;
yData = new double[];
if( yData == NULL )
{
std::cout << "Failed to allocate memory for yData!" << std::endl;
return -;
} zData = new double[];
if( zData == NULL )
{
std::cout << "Failed to allocate memory for zData!" << std::endl;
return -;
} // copy data from mwArray to C++
y.GetData(yData, );
z.GetData(zData, ); // print output
std::cout << "y = " << std::endl;
std::cout << yData[] << ",/t" << yData[] << std::endl;
std::cout << yData[] << ",/t" << yData[] << std::endl;
std::cout << "z = " << std::endl;
std::cout << zData[] << ",/t" << zData[] << std::endl;
std::cout << zData[] << ",/t" << zData[] << 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 ;}

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

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

    做实验需要将matlab实现的meanshift的结果中的region的Iabels矩阵,需要把labels.mat读入VS2010中,实现功能,在此把实现过程记录下来. C++读取mat文件的步骤如 ...

  2. VS2010引用App_Code下的类文件问题解决方法

    原文连接:http://blog.csdn.net/zjlovety/article/details/7658528 VS2020中“添加ASP.NET文件夹”里没有App_Code,添加普通文件夹然 ...

  3. WP8.1开发中找程序下的Assets文件夹

    这俩天在开发另一个程序时,遇到一个小问题:如何调用程序下的Assets文件夹及其下的文件和文件夹: 在网上找了两天,基本上是关于如何调用手机中库的方法,没找到有关介绍如何调用查找 编译前添加图片或其它 ...

  4. JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)

    JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...

  5. python调用另一个文件中的代码,pycharm环境下:同文件夹下文件(.py)之间的调用,出现红线问题

    如何调用另一个python文件中的代码无论我们选择用何种语言进行程序设计时,都不可能只有一个文件(除了“hello world”),通常情况下,我们都需要在一个文件中调用另外一个文件的函数呀数据等等, ...

  6. Golang调用windows下的dll动态库中的函数 Golang 编译成 DLL 文件

    Golang调用windows下的dll动态库中的函数 package main import ( "fmt" "syscall" "time&quo ...

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

    VS2010 C++环境下DLL和LIB文件目录及名称修改 转自:http://blog.csdn.net/archielau/article/details/8507581 DLL工程,Debug版 ...

  8. 转载 Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))

    转载:程兴亮文章,地址;http://www.cnblogs.com/chengxingliang/archive/2011/02/07/1949579.html 使用WebClient读取XAP包同 ...

  9. Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))【附带实例源码】

    使用WebClient读取XAP包同目录下的XML文件 我们想要读取XAP包下面的XML文件,需要将此XML文件放在加载XAP包的网页的目录中去,然后使用URI方式读取此URL方式下的XML文件. 首 ...

随机推荐

  1. /****************** Attributes ********************/

    /*预定义字符属性的文本.如果钥匙不在字典,然后使用默认值,如下所述. */ 以下属性是IOS6的 NSVerticalGlyphFormAttributeName NS_AVAILABLE_IOS( ...

  2. Orcale Function Sequence

    Orcale Function Sequence. 1 Create Or Replace Function F_Get_Sequence(As_Companyno In Varchar2, As_T ...

  3. python学习笔记9(对文件的操作)

    一.文件对象 我理解的文件对象就是一个接口,通过这个接口对文件进行相关操作. 二.相关函数 [1].内建函数:open() 提供了初始化输入/输出(I/O)操作的通用接口,成功打开一个文件后会返回一个 ...

  4. SDIBT 3237 Boring Counting( 划分树+二分枚举 )

    http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=3237 Problem H:Boring Counting Time Limit: 3 Sec  ...

  5. HTML元素大小和位置相对于谁的问题

    一.如果元素的position属性值为absolute,那么此时分为两种情况: 1. 父级(包括直接父级和间接父级)元素中没有定义position属性(即默认属性static),那么该元素会参照页面, ...

  6. iis7、mvc2.0 文件上传配置方案

    http://blog.csdn.net/useruse/article/details/5602495

  7. Hibernate简介2

    一.主配置 ◆查询缓存,同下面讲的缓存不太一样,它是针对HQL语句的缓存,即完全一样的语句再次执行时可以利用缓存数据.但是,查询缓存在一个交易系统(数据变更频繁,查询条件相同的机率并不大)中可能会起反 ...

  8. hibernate一对一双向外键关联

    一对一双向外键关联:双方都持有对方的外键关联关系. 主控方和一对一单向外键关联的情况是一样的,主要的差异表现为,被空方需要添加: @OneToOne(mappedBy="card" ...

  9. 认识RGB和YUV

    多年来,对于大部分人来说,对图形信号的认识不外有三种:射频信号,复合视频信号,S视频信号.射频信号是由复合视频信号调到高频上,普通电视机的天线输入信号用于射频信号,复合视频信号的输入出是用RGA端子. ...

  10. Redis安装整理(window平台) +php扩展redis

    window平台Redis安装 redis windows安装文件下载地址:http://code.google.com/p/servicestack/wiki/RedisWindowsDownloa ...