VS2008 C++ 调用MATLAB 2009b 生成的DLL

62 篇文章 2 订阅

这个代码和流程我测试过,可以运行 sg

 

实验环境:

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

 

Cpp代码   收藏代码
  1. function [y,z] = myadd2(a, b)  
  2. % dummy function, just to demonstrate the idea  
  3. y = a+b;  
  4. z = a+2*b;  
  5. end  
 

 

在MATLAB命令框中输入以下命令:

mcc -C -W cpplib:libmyadd2 -T link:lib myadd2.m (important, you should add -C sg)

 

在默认路径下(存放对应.m文件)生成libmyadd2.lib, libmyadd2.h, libmyadd2.dll , libmyadd2.ctf 等文件,将这三个文件拷到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代码   收藏代码
  1. #include <iostream>  
  2. #include "mclmcrrt.h"  
  3. #include "libmyadd2.h"  
  4. #pragma comment(lib,"libmyadd2.lib")
    #pragma comment(lib,"mclmcrrt.lib ") // sg
  5. int main() 
  6. {  
  7.     std::cout << " function [y,z] = myadd2(a, b) " << std::endl;  
  8.     std::cout << " y = a+b; "   << std::endl;  
  9.     std::cout << " z = a+2*b; " << '\n' << std::endl;  
  10.       
  11.        // 初始化MCR  
  12.         if( !mclInitializeApplication(NULL,0) )   
  13.         {   
  14.             std::cout << "Could not initialize the application!" << std::endl;  
  15.             return -1;   
  16.         }   
  17.   
  18.   
  19.         // 初始化引用  
  20.         if( !libmyadd2Initialize())  
  21.         {  
  22.             std::cout << "Could not initialize libmyadd2!" << std::endl;  
  23.             return -1;   
  24.         }  
  25.   
  26.         try  
  27.         {  
  28.             //初始化 a  
  29.             mwArray a(2, 2,  mxDOUBLE_CLASS);  
  30.             double *aData,*bData;  
  31.             aData = new double[4];  
  32.             bData = new double[4];  
  33.   
  34.             forint i=0; i<4; ++i)  
  35.             {  
  36.                aData[i] = 1.0*i;  
  37.             }  
  38.   
  39.             std::cout << "a = " << std::endl;  
  40.             std::cout << aData[0] << ","  << aData[1] << std::endl;  
  41.             std::cout << aData[2] << "," << aData[3] << '\n' << std::endl;  
  42.   
  43.             a.SetData(aData, 4);  
  44.   
  45.              //初始化 b  
  46.             mwArray b(2, 2,  mxDOUBLE_CLASS);  
  47.             b(1,1) = 11.;  
  48.             b(1,2) = 12.;  
  49.             b(2,1) = 21.;  
  50.             b(2,2) = 22.;  
  51.   
  52.             b.GetData(bData, 4);  
  53.             std::cout << "b = " << std::endl;  
  54.             std::cout << bData[0] << "," << bData[1] << std::endl;  
  55.             std::cout << bData[2] << "," << bData[3] <<  '\n' << std::endl;  
  56.                
  57.             //定义输出 y z  
  58.             mwArray y(2, 2,  mxDOUBLE_CLASS);  
  59.             mwArray z(2, 2,  mxDOUBLE_CLASS);  
  60.   
  61.             // 调用dll  
  62.             myadd2(2, y, z, a, b);  
  63.   
  64.             double *yData, *zData;  
  65.             yData = new double[4];  
  66.             zData = new double[4];  
  67.   
  68.             // 拷贝数据到 C++  
  69.             y.GetData(yData, 4);  
  70.             z.GetData(zData, 4);  
  71.   
  72.             // 输出结果  
  73.             std::cout << "y = " << std::endl;  
  74.             std::cout << yData[0] << "," << yData[1] << std::endl;  
  75.             std::cout << yData[2] << "," << yData[3] << '\n' << std::endl;  
  76.   
  77.             std::cout << "z = " << std::endl;  
  78.             std::cout << zData[0] << "," << zData[1] << std::endl;  
  79.             std::cout << zData[2] << "," << zData[3] << std::endl;  
  80.   
  81.             // 释放内存  
  82.             delete [] aData;  
  83.             delete [] zData;  
  84.             delete [] yData;  
  85.         }  
  86.         catchconst mwException& e)  
  87.         {  
  88.           std::cerr << e.what() << std::endl;  
  89.                     
  90.         }  
  91.   
  92.         // 结束 lib  
  93.         libmyadd2Terminate();  
  94.   
  95.         // terminate MCR  
  96.         mclTerminateApplication();  
  97.   
  98.   
  99.         return 0;  
  100. }  
 

运行效果如下:

 

问题

1 .创建状态链接库(在matlab中使用mcc命令):

mcc -C -W cpplib:libinverse -T link:lib inverse.m (important sgliu)

这里加了一个-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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值