vs2012和Matlab R2014a混合

思路:为了实现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 idea
y = 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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值