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

VS2008 C++ 调用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下来,只有一个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

 

在默认路径下(存放对应.m文件)生成libmyadd2.lib, libmyadd2.h, libmyadd2.dll 等文件,将这三个文件拷到VS的项目目录下。

 

2. VS调用DLL

2.1 新建一个项目,并设置环境

新建一个win32 控制台应用程序,取名字是matlabDll2.当然新建其他的项目类型也可以,这只是个例子。接下来进行配置,在该项目的属性中进行了配置,只对该项目有效。若建新的项目需要重新配置。项目建好后将libmyadd2.lib, libmyadd2.h, libmyadd2.dll拷贝到项目目录下。

首先配置项目属性页/配置属性/C-C++/常规/附加包含目录,请根据自己电脑上软件的安装位置对照设置,20082005不同的地方时这里要加两个目录,如下图所示:

 

其次配置项目属性页/配置属性/链接器/常规/附加库目录,请根据自己电脑上软件的安装位置对照设置,如下图所示:

 

然后配置项目属性页/配置属性/链接器/输入/附加依赖性,填入libmyadd2.lib mclmcrrt.lib mclmcr.lib ,如下图所示:

 

还有其他的一些包含lib,比如libmex.lib  libmx.lib ,这里没填,好像是VC6上要配的。配置到此结束。

 

2.2 编写主程序,调试运行

这段代码是从别处拷来的,是一段完整代码,将它粘到matlabDLL2.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秒,还以为程序死循环了,起码证明是动态引用。解决办法还没找到。附件中是编译后的matlab dll。

 

 

 

 

分享到:
评论
3 楼 herohuyongtao 2012-04-29  
多谢, 正需要这个~
2 楼 lunan 2011-11-27  
http://hi.baidu.com/feiniaoah/blog/item/75d5a125a32ee46a34a80f31.html
http://blog.csdn.net/infocarrier/article/details/5854522
http://our2848884.blog.163.com/blog/static/146854834201121812642279/
1 楼 lunan 2011-11-27  
参考资料
http://379910987.blog.163.com/blog/static/3352379720116151449673/

相关推荐

    matlab生成DLL并用VC++调用

    通过上述步骤,我们已经成功地使用MATLAB 2009b生成了一个DLL文件,并在VC++ 2008环境中调用了该DLL。这种方法不仅能够提高代码的可移植性和复用性,还能够充分利用MATLAB的强大计算能力。对于需要跨语言开发的应用...

    vs2008_matalb2009b_DLL.rar_dll

    在IT领域,开发人员经常需要在不同的编程环境中交互操作,比如在Visual Studio 2008(VS2008)中调用MATLAB 2009b生成的动态链接库(DLL)。这个过程涉及到跨语言编程和接口设计,是一项技术含量较高的任务。以下是...

    matlab R2009b 2012b 破解文件

    把09b和12b的破解文件都放一块了,matlab R2009b 2012b 破解文件

    Matlab R2009b 下载地址+安装全过程

    为word文档 里面包含了下载地址 及安装全过程 下载并安装成功的记得留言啊 谢谢大家支持!!!!!!!!!

    MATLAB 2009b 从入门到精通 最新英文版教程

    ### MATLAB 2009b 从入门到精通——最新英文版教程 #### 知识点一:MATLAB概述 - **定义与功能**:MATLAB(Matrix Laboratory)是一款由MathWorks公司开发的用于数值计算的高级编程语言环境及其开发的相应软件。它...

    matlab 2009b crack

    matlab 2009b crack 請參照read me 文件

    mexcdf.r2859.zip_matlab 2009b_matlab isvar_matlab r2009 mexcdf_m

    标题中的“mexcdf.r2859.zip_matlab 2009b_matlab isvar_matlab r2009 mexcdf_m”暗示了这是一个关于Matlab的扩展功能包,特别关注的是处理mexcdf格式的数据。mexcdf是一种用于存储数组数据的二进制文件格式,它在...

    Matlab R2009b 不过期激活文件

    verycd上TBE的matlab R2009b激活文件只能使用到2017年。提供的激活文件可以使用到2037年(2037后需要系统支持)。

    Matlab矩阵实验室r2009b下载

    ### Matlab矩阵实验室r2009b下载及使用详解 #### 一、Matlab R2009b简介 Matlab(Matrix Laboratory)是由MathWorks公司开发的一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境...

    基于simulink的飞轮储能发电系统建模与仿真【包含程序操作录像】

    基于simulink的飞轮储能发电系统仿真,matlab2009b~matlab2013b范围版本测试

    解决MATLAB2009b和2010a不能在联网时打开的bug

    然而,MATLAB的某些版本可能存在一些已知问题,例如标题中提到的MATLAB r2009b和MATLAB r2010a在联网环境下无法正常启动图形用户界面(GUI)的问题。这个问题对用户的日常使用造成了困扰,特别是在需要网络连接的...

    matlab r2009b licesen

    matlab r2009b licesen,这个事standalone的lic文件,在安装的时候注意选择

    MatlabR2009b与VC混合编程

    在这一过程中,MatlabR2009b与Microsoft Visual C++ 2008的集成尤为关键。首先,需要配置Mbuild环境,通过`mbuild –setup`命令来指定编译器。在本例中,选择了Microsoft Visual C++ 2008 SP1作为编译器,并确认了其...

    VC中调用Matlab的学习

    - DLL文件路径:例如`D:\Program Files\MATLAB\R2009b\bin\win32` ##### 2.2 创建MATLAB函数 1. **编写MATLAB函数**:创建一个简单的MATLAB函数,例如`plot_test.m`,其功能是接收一个数据集并绘制出相应的图形。...

    Matlab_R2009b_-TBE.5087882.TPB下载种子

    6. **与外部系统集成**:Matlab R2009b强化了与其他编程语言(如C、C++、Java)的接口,方便数据交换和代码调用,同时也支持与数据库和Web服务的连接。 7. **并行计算**:此版本加强了并行计算支持,利用多核处理器...

    C#调用Matlab COM示例

    在这个示例中,我们创建了一个`ApplicationClass`对象来代表Matlab实例,然后通过`Execute`方法运行Matlab脚本,生成3D曲面图。最后,我们将图形窗口设置为可见,并等待用户关闭窗口后程序才退出。 需要注意的是,...

Global site tag (gtag.js) - Google Analytics