vs2012和Matlab R2014a混合

来源:互联网 发布:gta5娇羞萌妹捏脸数据 编辑:程序博客网 时间:2024/06/10 11:05

思路:为了实现C++与Matlab混合编程,采用由m文件构造动态链接库然后在visual studio中调用的方法。

系统:Windows 7旗舰版(64位),VS2012旗舰版,Matlab R2014a 


1、Matlab中dll文件创建

1.1 m文件编写

function [y,z] = myadd2(a, b)% dummy function, just to demonstrate the ideay = a+b;z = a+2*b;end


1.2 设置编译器

>>mbuild -setup

MBUILD 配置为使用 'Microsoft Visual C++ 2012 (C)' 以进行 C 语言编译。


要选择不同的 C 编译器,请从以下选项中选择一种命令:
Microsoft Visual C++ 2012 (C)  mex -setup:C:\Users\jdc\AppData\Roaming\MathWorks\MATLAB\R2014a\MBUILD_C_win64.xml C -client MBUILD
Microsoft Visual C++ 2010 (C)  mex -setup:D:\MATLAB\R2014a\bin\win64\mexopts\msvc2010.xml C -client MBUILD


要选择不同的语言,请从以下选项中选择一种命令:
 mex -setup C++ -client MBUILD 
 mex -setup FORTRAN -client MBUILD


这里我选择的是: mex -setup C++ -client MBUILD 


要选择不同的 C++ 编译器,请从以下选项中选择一种命令:
Microsoft Visual C++ 2012  mex -setup:C:\Users\jdc\AppData\Roaming\MathWorks\MATLAB\R2014a\MBUILD_C++_win64.xml C++ -client MBUILD
Microsoft Visual C++ 2010  mex -setup:D:\MATLAB\R2014a\bin\win64\mexopts\msvcpp2010.xml C++ -client MBUILD

选择:Microsoft Visual C++ 2012


1.3 DLL的生成

在MATLAB命令框中输入以下命令:(确保)

 mcc -W cpplib:libmyadd2 -T link:lib myadd2.m

生成libmyadd2.lib, libmyadd2.h, libmyadd2.dll 等文件,将这三个文件拷到VS的项目目录下



2、VS2012调用DLL

2.1 新建vs项目,并设置环境

新建一个win32 控制台应用程序,我取名matlabMyaddtest.。接下来进行配置,在该项目的属性中进行了配置,只对该项目有效。若建新的项目需要重新配置。

项目建好后将libmyadd2.lib, libmyadd2.h, libmyadd2.dll三个文件拷贝到项目目录下。

首先配置项目属性页/配置属性/VC++目录,根据自己电脑上软件的安装位置对照设置,如下图所示:


其次配置项目属性页/配置属性/链接器/输入/附加依赖项,填入libmyadd2.lib mclmcrrt.lib mclmcr.lib(三个之间回车),如下图所示:


注意:与自己电脑系统相对应的bin路径还需要加入到系统环境变量中,我的电脑是D:\MATLAB\R2014a\bin\win64,如下图所示:


配置工作到此结束。


2.2编写主程序,调试运行

#include <iostream>#include "mclmcr.h"#include "mclcppclass.h"#include "libmyadd2.h"int main(int argc, char* 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] << ", " << aData[1] << std::endl;        std::cout << aData[2] << ", " << 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);//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] << ", " << yData[1] << std::endl;        std::cout << yData[2] << ", " << yData[3] << std::endl;        std::cout << "z = " << std::endl;        std::cout << zData[0] << ", " << zData[1] << std::endl;        std::cout << zData[2] << ", " << 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;}

程序运行结果如下:


参考:http://blog.csdn.net/pipiqiqi123/article/details/7709683

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2岁宝宝呕吐发烧怎么办 2岁宝宝呕吐厉害怎么办 1岁宝宝半夜呕吐怎么办 2岁半宝宝呕吐怎么办 2岁宝宝半夜呕吐怎么办 两岁宝宝一直吐怎么办 原画师老了以后怎么办 孩子不想上学怎么办怎么去说服 嫉妒别人比我好怎么办 三岁宝宝爱打人怎么办 1岁宝宝喜欢打人怎么办 ps图层解锁不了怎么办 沈腾结婚马丽怎么办 延长甲没有纸托怎么办 高考第一志愿没录取怎么办 电子画颜料干了怎么办 数字画颜料干了怎么办 彩砂纸画不好了怎么办 宝宝吃了油画棒怎么办 2岁宝宝不爱刷牙怎么办 两岁宝宝不刷牙怎么办 1岁宝宝不爱刷牙怎么办 3岁宝宝不肯刷牙怎么办 20岁没学历迷茫怎么办 四岁了不长头发怎么办 17岁掉头发严重怎么办 头发很油,又少怎么办 25岁头发变稀怎么办 宝宝头发少又黄怎么办 头旋附近头发少怎么办 25岁掉头发严重怎么办 2岁宝宝头发稀少怎么办 掉头发很厉害怎么办吧 头发点的很厉害怎么办 为什么掉头发很厉害怎么办 产后2年脱发严重怎么办 产妇掉头发很厉害怎么办 头发掉了怎么办小妙招 头顶头发掉的厉害怎么办 20岁头发有些少怎么办 头痒头发掉厉害怎么办