Matlab R2012a和vs 2010混合编程

来源:互联网 发布:南京联迪软件 编辑:程序博客网 时间:2024/04/30 17:25


环境:Matlab R2010a,vs 2010 ,win7, 64位操作系统


假设有一Matlab函数文件 MyAdd.m,内容如下:

function c = MyAdd( a,b )%UNTITLED Summary of this function goes here%   Detailed explanation goes herec=a+b;end

一、matlab编译环境的设置

1、 >>mex –setup
Pleasechoose your compiler for building external interface (MEX) files: 
Would you like mex to locate installed compilers [y]/n?  n
这个地方如果选择y,那么就看不到vs2010 c++的编译器,只能看到C++6.0的(我电脑里装了这两个),我之前写的就是用C++6.0的编译器编译的DLL,再用VS2010可以调用成功的。如果这时候你想选择vs2010 c++的编译器,就要选择n,我想也应该可以的

接下来几个选择 y

2、>> mbuild –setup
 同上1

3、然后,进行编译,命令如下:
 >>mcc -W cpplib:libMyAdd -T link:lib MyAdd.m

会生成如下文件:
libMyAdd.cpp(这里有函数接口说明)
libMyAdd.dll
libMyAdd.h
libMyAdd.ctf
libMyAdd.lib

这四个是要用到的文件。

二、vs2010 配置

Vs2010中创建一个工程(C++程序),对VC进行环境配置:

右键单击工程->属性->

(1)   VC++目录,在“包含目录”中添加

       C:\Program Files\MATLAB\R2012a\extern\include

   (根据自己matlab安装的目录添加)

 “库目录”中添加:

    C:\Program Files\MATLAB\R2012a\extern\lib\win64\microsoft

   (我安装的是 64位的)

(2)链接器->输入,在“附加依赖项”中添加:

                mclmcrrt.lib

                libMyAdd.lib

           (每个.lib占一行,后面无需任何标点)

64位还需设置:

1)右键工程->属性->链接器->高级->目标计算机

      MachineX86改为MachineX64

(2)生成->配置管理器->平台

       Win32改为x64

至此,VC配置成功。


三、vs2010 调用matlab 函数

运行之前把第一步第3小步生成的.h,.dll,.lib(libMyAdd.h   libMyAdd.lib   libMyAdd.dll三个文件放在Vs++程序的工程文件夹里


#include <stdio.h>#include <memory.h>#include <string>#include "libMyAdd.h"#include <mclmcr.h>using namespace std;void main(){double a = 6;double b = 9;double c;// initialize lib,这里必须做初始化!if( !libMyAddInitialize()){std::cout <<"Could not initialize libMyAdd!" << std::endl;//return -1;}// 为变量分配内存空间,可以查帮助mwArraymwArray mwA(1, 1, mxDOUBLE_CLASS); // 1,1表示矩阵的大小(所有maltab只有一种变量,就是矩阵,为了和Cpp变量接轨,设置成1*1的矩阵,mxDOUBLE_CLASS表示变量的精度)mwArray mwB(1, 1, mxDOUBLE_CLASS);mwArray mwC(1, 1, mxDOUBLE_CLASS);// set data,不用我解释了吧,很简单的,调用类里面的SetData函数给类赋值mwA.SetData(&a, 1);mwB.SetData(&b, 1);// using my add,掉我自己写的函数MyAdd(1, mwC, mwA, mwB);// get data,不用我解释了吧,很简单的,调用类里面的Get函数获取取函数返回值c = mwC.Get(1, 1);std::cout<<"c is " <<c<<std::endl;// 后面是一些终止调用的程序// terminate the liblibMyAddTerminate();// terminate MCRmclTerminateApplication();}


结果是: c   is   15

0 0
原创粉丝点击