转载:

刚开始学习用VC++调用matlab生成的DLL,找了网上一些资料,难以找到vs2008与MATLAB2009b版本的,按照以往版本做的总是有很多错误。经过两天努力,终于调试成功,这里将经验总结一下,以供有需要的人们参考。

实验环境:

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 idea
y = 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 <iostream>
#include
"mclmcr.h"
#include "mclcppclass.h"
#include "libmyadd2.h"

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[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;
}

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

运行结果如下图:

VS2008 C++ 调用MATLAB 2009b 生成的DLL .的更多相关文章

  1. 【转】三种方式在C++中调用matlab

      C/C++调用Matlab 在工程实践中,C/C++调用Matlab 的方法主要有调用Matlab 计算引擎.包含m 文件转 换的C/C++文件,以及调用m文件生成的DLL 文件. 1 利用Mat ...

  2. 【从业余项目中学习2】C# 实现调用Matlab函数(Visual Studio:2008, Matlab:R2009a)

    最近正在给客户做的个人项目,要求实现C#与Matlab之间的调用,即C# winform界面收集用户输入的参数,将参数传递给Matlab的算法计算,Matlab函数返回的结果显示在winform界面上 ...

  3. c++调用matlab生成的Dll动态连接库

    点击打开链接http://download.csdn.net/detail/nuptboyzhb/4228429 c++调用matlab生成的Dll动态连接库 实验平台:   matlab 7.0(R ...

  4. Qt Creator调用VS2008生成的DLL注意事项 good

    问题:生成的dll文件QT无法静态/隐式调用 分析:调用的lib库可能是msvc编译的,而我用Qt调用,Qt默认编译器是minGW,两种编译器生成的函数名不一样,所以调用的时候你要用哪个函数,编译结果 ...

  5. C#调用Matlab生成的Dll

    问题描述:最近开发需要调用matlab生成的DLL,在New MWNumericArray 对象的时候报错,提示未将对象引用到对象的实例. 问题分析:因为MWArray.dll是Matlab提供的DL ...

  6. asp.net下调用Matlab生成动态链接库

    对于这次论文项目,最后在写一篇关于工程的博客,那就是在asp.net下调用matlab生成的dll动态链接库.至今关于matlab,c/c++(opencv),c#(asp.net)我总共写了4篇配置 ...

  7. opencv通过dll调用matlab函数,图片作为参数

    [blog 项目实战派]opencv通过dll调用matlab函数,图片作为参数                   前文介绍了如何“csharp通过dll调用opencv函数,图片作为参数”.而在实 ...

  8. vs 2010调用matlab dll显示窗口核心代码

    matlab代码: figure('NumberTitle','off','menubar','none','toolbar','none','name','Topo Image'); x=0:pi/ ...

  9. C++调用C#生成的DLL文件的各种问题

    C++调用C#生成的DLL文件: 首先选择建立一个C#的类库,然后再按照需求编写需要的函数 之后,对于C++调用过程需要注意的几点: 1.使用#using <....some.dll>指出 ...

随机推荐

  1. Java 虚拟机并发编程

    chap 1. 竞争条件:不同的执行得到不同的结果.规避共享可变性(即对共享状态的修改)可避免不必要的竞争条件. chap 2. balance between 一致性.准确性和性能.过犹不及!线程数 ...

  2. diff详解,读懂diff结果

    1.概述 本文将要讨论的是diff命令,diff用来比较两个文件.当然文件比较的工具很多,windows系统下面就有不错的工具可以使用,例如常用的Beyond Compare,WinMerge都是图形 ...

  3. 一个App完成入门篇(一)-从Hello world开始

    程序员学习新技术都是通过Hello World开始的,我们也不例外.第一课我们简单了解利用do平台开发App的基本流程,能了解到的知识点是: 开发环境搭建 创建开发者账号 新建项目 拖拽一个组件 修改 ...

  4. 源代码版本管理与项目管理软件的认识与github的注册

    源代码版本管理软件: 主要有:svn,cvs,hg,git,VSS 这些工具主要是一种记录代码更改历史, 可以无限回溯, 用于代码管理,多个程序员开发协作的工具.Perforce,StarTeam)- ...

  5. 浅谈Excel开发:七 Excel 自定义任务窗体

    前面花了三篇文章讲解了Excel中的UDF函数,RTD函数和异步UDF函数,这些都是Excel开发中的重中之重.本文现在开始接着第二篇文章的菜单系统开始讲解Excel中可供开发的界面元素,本文要讲解的 ...

  6. SQL面试题

    Student(S#,Sname,Sage,Ssex) 学生表     S#:学号:Sname:学生姓名:Sage:学生年龄:Ssex:学生性别Course(C#,Cname,T#) 课程表     ...

  7. sizeof && strlen 的区别

    本文主要记录了 sizeof 操作符 和 strlen() 函数的区别,以及各自的用途.(在下才疏学浅,发现错误,还请留言指正) sizeof 和 strlen 的区别 示例代码如下: #includ ...

  8. How to fix updating ubuntu apt-get problem

    It's my new PC with a new os of ubuntu. every time when I want to install software or update apt-get ...

  9. 说说设计模式~适配器模式(Adapter)

    返回目录 之前和大家一起谈了工厂模式和单例模式,今天来看一下另一种非常常用的模式,它就是适配器模式,第一次看到这个模式是通过“张逸”老师的“设计之道”这篇文章,在这里表adapter讲的很透彻,今天把 ...

  10. 知方可补不足~SQL中的count命令的一些优化措施(百万以上数据明显)

    回到目录 SQL中对于求表记录总数的有count这个聚合命令,这个命令给我们感觉就是快,比一般的查询要快,但是,当你的数据表记录比较多时,如百万条,千万条时,对于count来说,就不是那么快了,我们需 ...