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 -;
}
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文件的更多相关文章
- 使用VS2010调用matlab的mat格式文件
做实验需要将matlab实现的meanshift的结果中的region的Iabels矩阵,需要把labels.mat读入VS2010中,实现功能,在此把实现过程记录下来. C++读取mat文件的步骤如 ...
- VS2010引用App_Code下的类文件问题解决方法
原文连接:http://blog.csdn.net/zjlovety/article/details/7658528 VS2020中“添加ASP.NET文件夹”里没有App_Code,添加普通文件夹然 ...
- WP8.1开发中找程序下的Assets文件夹
这俩天在开发另一个程序时,遇到一个小问题:如何调用程序下的Assets文件夹及其下的文件和文件夹: 在网上找了两天,基本上是关于如何调用手机中库的方法,没找到有关介绍如何调用查找 编译前添加图片或其它 ...
- JAVA 遍历文件夹下的所有文件(递归调用和非递归调用)
JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) 1.不使用递归的方法调用. public void traverseFolder1(String path) { int fileNum = ...
- python调用另一个文件中的代码,pycharm环境下:同文件夹下文件(.py)之间的调用,出现红线问题
如何调用另一个python文件中的代码无论我们选择用何种语言进行程序设计时,都不可能只有一个文件(除了“hello world”),通常情况下,我们都需要在一个文件中调用另外一个文件的函数呀数据等等, ...
- Golang调用windows下的dll动态库中的函数 Golang 编译成 DLL 文件
Golang调用windows下的dll动态库中的函数 package main import ( "fmt" "syscall" "time&quo ...
- VS2010 C++环境下DLL和LIB文件目录及名称修改
VS2010 C++环境下DLL和LIB文件目录及名称修改 转自:http://blog.csdn.net/archielau/article/details/8507581 DLL工程,Debug版 ...
- 转载 Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))
转载:程兴亮文章,地址;http://www.cnblogs.com/chengxingliang/archive/2011/02/07/1949579.html 使用WebClient读取XAP包同 ...
- Silverlight实用窍门系列:1.Silverlight读取外部XML加载配置---(使用WebClient读取XAP包同目录下的XML文件))【附带实例源码】
使用WebClient读取XAP包同目录下的XML文件 我们想要读取XAP包下面的XML文件,需要将此XML文件放在加载XAP包的网页的目录中去,然后使用URI方式读取此URL方式下的XML文件. 首 ...
随机推荐
- /****************** Attributes ********************/
/*预定义字符属性的文本.如果钥匙不在字典,然后使用默认值,如下所述. */ 以下属性是IOS6的 NSVerticalGlyphFormAttributeName NS_AVAILABLE_IOS( ...
- Orcale Function Sequence
Orcale Function Sequence. 1 Create Or Replace Function F_Get_Sequence(As_Companyno In Varchar2, As_T ...
- python学习笔记9(对文件的操作)
一.文件对象 我理解的文件对象就是一个接口,通过这个接口对文件进行相关操作. 二.相关函数 [1].内建函数:open() 提供了初始化输入/输出(I/O)操作的通用接口,成功打开一个文件后会返回一个 ...
- SDIBT 3237 Boring Counting( 划分树+二分枚举 )
http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=3237 Problem H:Boring Counting Time Limit: 3 Sec ...
- HTML元素大小和位置相对于谁的问题
一.如果元素的position属性值为absolute,那么此时分为两种情况: 1. 父级(包括直接父级和间接父级)元素中没有定义position属性(即默认属性static),那么该元素会参照页面, ...
- iis7、mvc2.0 文件上传配置方案
http://blog.csdn.net/useruse/article/details/5602495
- Hibernate简介2
一.主配置 ◆查询缓存,同下面讲的缓存不太一样,它是针对HQL语句的缓存,即完全一样的语句再次执行时可以利用缓存数据.但是,查询缓存在一个交易系统(数据变更频繁,查询条件相同的机率并不大)中可能会起反 ...
- hibernate一对一双向外键关联
一对一双向外键关联:双方都持有对方的外键关联关系. 主控方和一对一单向外键关联的情况是一样的,主要的差异表现为,被空方需要添加: @OneToOne(mappedBy="card" ...
- 认识RGB和YUV
多年来,对于大部分人来说,对图形信号的认识不外有三种:射频信号,复合视频信号,S视频信号.射频信号是由复合视频信号调到高频上,普通电视机的天线输入信号用于射频信号,复合视频信号的输入出是用RGA端子. ...
- Redis安装整理(window平台) +php扩展redis
window平台Redis安装 redis windows安装文件下载地址:http://code.google.com/p/servicestack/wiki/RedisWindowsDownloa ...