`
lunan
  • 浏览: 78447 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

VS2008C++调用MATLAB 2009b生成的DLL

 
阅读更多

 

本机环境:

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下来,可以按下列步骤操作

>> 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的函数,代码如下:

 

 

Cpp代码  
function [y,z] = myadd2(a, b)  
% 示例代码
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文件中,调试通过:

 

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秒,还以为程序死循环了,不过起码证明是动态引用。解决办法还没找到。附件中是所有的项目文件。

分享到:
评论

相关推荐

    Vs2008C++纯净版.7z.002

    Vs2008C++纯净版.7z.002 Vs2008 C++ 纯净版 vs2008 集成版 精简版 一共2个文件,放在备份. 我自己用的东西.删除了.NET相关的一些安装文件.

    VS2008C++贪吃蛇游戏

    【VS2008C++贪吃蛇游戏】是一个基于C++编程语言,在Visual Studio 2008环境下开发的经典小游戏。它展示了C++的基本语法、面向对象编程思想以及游戏编程的一些基本技巧。在这个项目中,开发者利用了C++的类来设计游戏...

    Vs2008C++纯净版.7z.001

    Vs2008C++纯净版 Vs2008 C++ 纯净版 vs2008 集成版 精简版 一共2个文件,放在备份. 我自己用的东西.删除了.NET相关的一些安装文件.

    vs2008C++实现AES加密解密算法

    本项目"vs2008C++实现AES加密解密算法"就是针对这一需求,使用C++编程语言在Visual Studio 2008环境下实现的一个DLL动态链接库,为用户提供AES256的加密和解密服务。 AES256是AES家族中的一种,它使用256位的密钥对...

    md5 算法的VS2008C++实现

    在VS2008C++环境中实现MD5算法,你需要了解以下关键知识点: 1. **基本概念**: - **哈希函数**:哈希函数是将任意大小的输入映射到固定大小输出的函数,MD5就是一种常见的哈希函数。 - **MD5摘要**:MD5将输入...

    2008C++.zip

    这些库文件是许多基于Visual C++编译的程序运行所必需的,因为它们包含了执行某些基本操作和调用C++标准库函数所需的组件。这些组件包括但不限于STL(Standard Template Library,标准模板库)、MFC(Microsoft ...

    VS2008C++速成版

    Visual Studio 2008(简称VS2008)是微软公司推出的一款强大的集成开发环境(IDE),它支持多种编程语言,包括C++。本资源是专为C++初学者设计的"VS2008 C++学习版",具有易用性和轻量级的特点,非常适合新手快速...

    VS2008C++环境下OpenGL 时钟代码

    OpenGL 时钟代码在 VS2008 C++ 环境下的实现 本文将通过对时钟代码的分析,讲解 OpenGL 在 VS2008 C++ 环境下的实现,涵盖时钟代码的基本结构、OpenGL 库的使用、时钟的绘制等知识点,并对代码中使用的各个函数和...

    VS2008C++MFC串口小程序采用MSComm控件

    `WriteData`函数通过调用`m_MSComm.Output`发送数据,而`ReadData`则使用`m_MSComm.Input`接收数据。需要注意线程安全和缓冲区管理。 10. **调试与测试**:在VS2008中,可以通过调试器观察程序运行状态,检查串口...

    VS2008c++ 对操作EXCEL进行的类的封装

    最近想研究vc中读取,存取excel文档,但所用的编译器是vs2008版本,网上多数教程或封装的有关类是vc6.0版本的,介于2008中很多的不同,我搜集网上的方法对有关操作excel的类进行了封装,以便于直接的使用。...

    vs2008C++和winpcap开发的网络嗅探器(配套软件WinPcap_4_0_2.exe和中英文开发包详细教程及其教程代码)

    《使用VS2008 C++与WinPcap开发网络嗅探器》 网络嗅探器是一种用于捕获网络数据包的工具,它能够帮助我们分析网络流量,诊断网络问题,进行安全审计以及进行网络性能优化。在本教程中,我们将深入探讨如何使用...

    东南大学2008C++上试卷.doc

    【标题】和【描述】提及的是“东南大学2008C++上试卷”,这是一份针对C++编程语言的考试试卷,主要测试学生对计算机基础知识和C++程序设计的理解。 【部分内容】提供了试卷的部分题目,包括选择题和填空题,涵盖了...

    visual Studio2008C++ expression使用文档

    《Visual Studio 2008 C++ 表达式使用指南》 Visual Studio 2008 C++ Express Edition 是微软推出的一款免费的C++集成开发环境,虽然它不具备完整版Visual Studio的所有功能,但对初学者和小型项目来说已足够使用。...

    VS2008进行C++开发的智能提示插件

    标题中的“VS2008进行C++开发的智能提示插件”指的是在Microsoft Visual Studio 2008(简称VS2008)环境下,用于C++编程的一种增强型智能感知工具。这类插件通常能提升开发者的编程效率,通过提供自动补全、代码片段...

    Vs2008的C++

    【标题】"Vs2008的C++" 指的是使用Visual Studio 2008这个集成开发环境(IDE)进行C++程序开发的相关知识。Visual Studio 2008是微软发布的一款强大的开发工具,它为C++程序员提供了全面的开发支持,包括编辑器、...

    基于VS2008C#+窗体+学生选课系统的设计与实现

    《基于VS2008 C#+窗体的学生选课系统设计与实现》 在信息技术日益发展的今天,学生选课系统的建设对于提升教育管理效率、优化教学资源配置具有重要意义。本项目以Visual Studio 2008(简称VS2008)为开发环境,采用...

    Visual C++ 2008入门经典(全书代码)

    《Visual C++2008入门经典》系编程语言先驱者Ivor Horton的经典之作,是C++编程方面最畅销的图书品种之一,不仅涵盖了Visual C++ 2008编程知识,还全面介绍了标准C++语言和C++/CLI。

    visual c++ 2008 compiler tools

    4. **链接器(Linker)**:将多个编译单元合并,并解决外部符号引用,生成最终的可执行文件或库。 二、编译器工具特性 1. **优化(Optimization)**:Visual C++ 2008 提供了多种优化选项,如基本优化、关联系统...

    vs2008最新配色方案

    4个非常好的开发配色方案,根据你自己需求和感官,选择自己适合的文档进行配色,配色方法如下你需要从vs2008 IDE上单击“工具”-“导入和导出设置”-“导入选定的环境设置”,如果当前设置需要保存就继续单击“是,...

Global site tag (gtag.js) - Google Analytics