VS2008 C++ 调用MATLAB 2010a 生成的DLL

C++ VS混合编程--VS执行崩溃问题 1、通过mex -setup mbuild -setup设置合适的编译器。 2、将Matlab m文件转化为.h .lib .dll a,指令生成  ---->新建m文件 例如:function [y,z] = myadd2(a,b) y =a+b; z = a + 2*b endmcc -W cpplib:libmyadd2 -T link:lib myadd2.m 将对应的.h .li 阅读详情

转载:http://blog.csdn.net/infocarrier/article/details/5854522,但是还是有些修改

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

实验环境:

Win7

MATLAB 2010a(安装路径:E:/Program Files/MATLAB/R2009a)

VS2008 中文版(安装路径:E:/Program Files/Microsoft Visual Studio 9.0)

1.Matlab 生成DLL

1.1配置matlab

在matlab中先安装编译器,我在第一次安装的时候一路y下来,只有一个compiler,还是最老的。这教育我们要学会说N,按照以下步骤操作

>> mex -setup
Please choose your compiler for building external interface (MEX) files: 
 
Would you like mex to locate installed compilers [y]/n? y
 
Select a compiler: 
[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2010a\sys\lcc 
[2] Microsoft Visual C++ 2010 in D:\Program Files\Microsoft Visual Studio 10.0 
[3] Microsoft Visual C++ 2008 SP1 in D:\Program Files\Microsoft Visual Studio 9.0 
[4] Microsoft Visual C++ 6.0 in D:\Program Files\Microsoft Visual Studio 
 
[0] None 
 
Compiler: 3
 
Please verify your choices: 
 
Compiler: Microsoft Visual C++ 2008 SP1  
Location: D:\Program Files\Microsoft Visual Studio 9.0 
 
Are these correct [y]/n? y
 
*************************************************************************** 
  Warning: MEX-files generated using Microsoft Visual C++ 2008 require 
           that Microsoft Visual Studio 2008 run-time libraries be  
           available on the computer they are run on. 
           If you plan to redistribute your MEX-files to other MATLAB 
           users, be sure that they have the run-time libraries. 
*************************************************************************** 
 
Trying to update options file: C:\Users\Hellen\AppData\Roaming\MathWorks\MATLAB\R2010a\mexopts.bat 
From template:              D:\PROGRA~1\MATLAB\R2010a\bin\win32\mexopts\msvc90opts.bat 
 
Done . . . 
 
************************************************************************** 
  Warning: The MATLAB C and Fortran API has changed to support MATLAB 
           variables with more than 2^32-1 elements.  In the near future 
           you will be required to update your code to utilize the new 
           API. You can find more information about this at: 
           http://www.mathworks.com/support/solutions/en/data/1-5C27B9/?solution=1-5C27B9 
           Building with the -largeArrayDims option enables the new API. 
************************************************************************** 

>> mbuild -setup
Please choose your compiler for building standalone MATLAB applications: 
 
Would you like mbuild to locate installed compilers [y]/n? y
 
Select a compiler: 
[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2010a\sys\lcc 
[2] Microsoft Visual C++ 2008 SP1 in D:\Program Files\Microsoft Visual Studio 9.0 
[3] Microsoft Visual C++ 6.0 in D:\Program Files\Microsoft Visual Studio 
 
[0] None 
 
Compiler: 2
 
Please verify your choices: 
 
Compiler: Microsoft Visual C++ 2008 SP1  
Location: D:\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\Hellen\AppData\Roaming\MathWorks\MATLAB\R2010a\compopts.bat 
From template:              D:\PROGRA~1\MATLAB\R2010a\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 控制台应用程序,我取的名字是matlabDll.当然新建其他的项目类型也可以,我这只是个例子。接下来进行配置,在该项目的属性中进行了配置,只对该项目有效。若建新的项目需要重新配置。项目建好后将libmyadd2.lib, libmyadd2.h, libmyadd2.dll拷贝到项目目录下。

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

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

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

在这一步俺可吃了大苦头了,有篇文档只说添加前两项,俺就照做了,结果导致运行失败,找了好长时间也没发现错误,两天的功夫都在找,结果就是因为少填了这一项,还有其他的一些包含lib,比如libmex.lib  libmx.lib ,这里没填,好像是VC6上要配的。

配置到此结束

注意,其实mclmcrrt.lib也是没用要!!

2.2 编写主程序,调试运行

这段代码是从别处拷来的,是一段完整代码,将它粘到matlabDLL2.cpp 主CPP文件中,调试通过:

#include <iostream>
//#include "mclmcr.h"
//#include "mclcppclass.h"
#include "libmyadd2.h"

#pragma comment(lib, "libmyadd2.lib")  
#pragma comment(lib, "mclmcrrt.lib") 

int main()
{

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


运行结果如下图:



问题

我将代码的标红部分注释掉了,否则会出现错误:

1>c:/users/administrator/documents/visual studio 2008/projects/matlabdll2/matlabdll2/matlabdll2.cpp(14) : error C3861: “mclInitializeApplication_proxy”: 找不到标识符

我不知道为什么,大家在调试的过程如果解决了这个问题,麻烦告诉一声:liufengjk_ok@126.com

致谢

感谢taohe等网友提供的参考!

VS或VC调用matlab程序dll路径配置及错误分析 vc6.0版本的 1:在matlab中选择compiler。      在命令行窗口输入:mex -setup       按照提示选择vc6.0.由于使用的是matlab7,不识别vs20102008,无奈有装的vc6.0。但听说最新版的matlab可以识别。 2:选择builder.    输入:mbuild -setup    同样选择vc6.0 阅读详情

相关推荐

QT,matlab混合调试,MATLAB生成DLL,将多个m文件合并生成一个DLL

     最近再做一个项目。用qt有好的界面调用MATLAB已经写好的算法,亲自踩了很多的坑,在这里分享一下:1,混合调试有两种方法,比较主流的就是调用MATLAB生成DLL,进行联调;2,调用MATLAB自身引擎的方法,进行联调;自认为调用MATLAB引擎的方式,在运行QT的时候蹦出来MATLAB的界面,会比较尴尬,最终选择了生成DLL的方法。看着网上的教程,以为会很简单,但是这样简单的东西我...

LittleYoY的专栏 3365

matlab生成DLL并用VC++调用

详细讲解了matlab2009b 生成dll文件的过程,并且有vc++2008调用的实例,

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下来,...

zlunan的专栏 254

VC++2010调用matlab产生的dll文件

该程序包含利用matlab产生的dll文件,.h文件,.lib文件,以及利用VC++调用dll文件的源程序

mclInitializeApplication调用失败的问题

需要将Matlab的路径加入到Path路径,并重启电脑。 我使用的是MatlabR2018b C:\Program Files\MATLAB\R2018b\runtime\win64 C:\Program Files\MATLAB\R2018b\bin C:\Program Files\MATLAB\R2018b\polyspace\bin

2067

C++ 调用MATLAB引擎 在memcpy处报错,解决方案

在用C++调用MATLAB做数值计算的时候,遇到了内存越界报错 ... y1 = mxCreateDoubleMatrix(1, N, mxREAL); memcpy((void*)mxGetPr(y1), (void*)y, N*sizeof(double)); 代码如上,光看这一句似乎没什么问题,花了半天功夫才找到原因:MATLAB引擎没有初始化 mxCreateDoubleMatrix...

Twinmoons的博客 1188

C++ Matlab混合编程入门

本篇笔记将纪录C++调用Matlab封装生成的动态。 编译环境:VS2008 + Matlab2010a 一、Matlab编译生成dll 编写一个myadd.m文件,实现加法: function [y,z]=myadd(a,b) y = a+b; z = a+2*b; end 在Matlab的命令行中安装编译环境: 前后分别输入mex –setup和mbuild –setup,...

学习雷锋好榜样 2407

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

vs2008调用matalb2009b生成DLL,自己摸索的经验,供大家参考

infocarrier的专栏 1万+

c 调用matlab生成dll,vs2008调用matlab生成dll

matlab版本为:matlab7.11.0(R2010b)vs20081.在matlab生成dll在m文件中实现如下功能:获得N个魔方矩阵的秩。m文件的内容如下:function r = mrank(n)r = zeros(n,1);for k=1:nr(k) = rank(magic(k));end将上述内容保存为:mrank.m在matlab的command 窗口键入:>> m...

weixin_42441072的博客 1340

Matlab与C语言混合编程汇总完整版

此书教你如何把C语言和Matlab编程结合起来应用得到程序的开发中,条理清晰,代码完整!

vs2008 matlab2009

好久没有Coding了,今天兴趣来了,找了一本MatlabC++嵌入式编程的书翻了翻,想到以后可能也需要用,就觉得尝试着弄了下,这一弄就是大半天过去了,有些问题没有搞清楚,但是也算是开了个头现在写一下收获心得:MatlabC++的嵌入方法分为以下三类:1,Matlab调用C+

xyqzki的专栏 2622

C++Matlab联合编程(DLL版)

本文是关于使用C++调用Matlab编译生成Dll的说明,仅适用于m函数,使用版本为VS2008+MatlabR2009a。 1.配置Matlab编译环境在Matlab中分别使用命令mbuild -setup与mex -setup配置生成Dll所使用的编译器。 2.生成Dll假设m函数所在文件为t1.m,可以使用以下指令生成dll:mcc -t -h -L C -W

hx5230的专栏 2713
上一篇: matlab2010 + vc6.0混合编程实例(调用dll)
下一篇: VC 与MATLAB接口编程方法与实现(转)
紫荆飘香V
博客等级 码龄17年 204粉丝 126原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值