vs2010和Matlab R2012a 混合编程

来源:互联网 发布:vb如何删除非打印字符 编辑:程序博客网 时间:2024/05/21 09:54
转自:http://blog.sina.com.cn/s/blog_4fc6546101011cu5.html
本人系统Windows 7旗舰版,32位,采用由m文件构造动态链接库然后在visual studio中调用的方法。

1. MATLAB 环境配置:

 

注:Matlab r2010b及以后版本才支持vs2010, 之前版本中mbuild命令输入后可能会找不到vs2010编译器。


2.书写m文件

示例如下:

 

function [ c ] = MyAdd( a,b )

%UNTITLED Summary of this function goes here

%   Detailed explanation goes here


c=a+b;

end

保存为MyAdd.m


3.创建动态链接库

Matlab中输入:mcc -W cpplib:libMyAdd -T link:lib MyAdd -d [生成文件路径]

 

其中,mccMatlab提供的编译命令,对于这一点,Matlab的帮助说明如下:
-W lib:string link:lib其中-W是控制编译之后的封装格式,cpplib,是指编译成C++libcpplib冒号后面是指编译的库的名字,-T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字是后面的MyAdd,即你写的m函数的名字。
运行完之后,你的目录下面,将会出现以下一些文件:
libMyAdd.cpp
libMyAdd.exp
libMyAdd.dll
libMyAdd.exports
libMyAdd.h
libMyAdd.lib
mccExcludedFiles.log
readme.txt
具体每一个文件的意思,请查帮助,这里只说其中很有用的几个:
libMyAdd.dll是编译好的动态库,MyAdd这个函数封装在里面,libMyAdd.h是对应的头文件,在C里面调用这个函数的时候,需要include这个头文件在这个头文件的最后,你可以看到下面的内容:
extern LIB_libMyAdd_CPP_API void MW_CALL_CONV MyAdd(int nargout, mwArray& c, const mwArray& a, const mwArray& b);
这就是MyAddC函数的声明。nargout表示输出变量的个数,abc就是对应了m函数的几个变量。
注意,abc三个变量的类型是mwArray,这是Matlab提供的一个特殊的变量类型(在7.0的版本,编译之后,变量类型是mxArray)。mwArray是一个类,具体可以查帮助。


4.系统环境配置

 

Computer Properties -> Advanced system settings -> Environment Variables -> User Variables -> path, 添加(MATLAB下为MATLAB 2012软件安装目录)

...\MATLAB\extern\lib\win32\microsoft;

...\MATLAB\bin\win32

Computer Properties -> Advanced system settings -> Environment Variables -> System Variables -> path, 添加

...\MATLAB\runtime\win32;

...\MATLAB\bin;

...\MATLAB\extern\lib\win32\microsoft;

...\MATLAB\bin\win32


5.vs2010环境配置

 

a.创建一个console application, 并新建一个cpp文件(否则之后Property Pages中没有C/C++目录 )

b. 设置目录

①Property Pages -> VC++ Directories -> Include Directories, 添加(安装目录下)

...\MATLAB\extern\include\ 

②Property Pages -> VC++ Directories -> Library Directories, 添加

...\MATLAB\extern\lib\win32\microsoft

 

③Property Pages -> C/C++ -> General -> Additional Include Directories, 添加

...\MATLAB\extern\include\

 

④Property Pages -> Linker -> General -> Additional Library Directories, 添加

...\MATLAB\extern\lib\win32\microsoft

 

⑤Property Pages -> Linker -> Input -> Additional Dependencies, 添加

 

libeng.lib

libmat.lib

libmex.lib

libmx.lib

mclmcrrt.lib

mclmcr.lib

libMyAdd.lib


6.vs2010下完成程序

 

把刚才生成的lib*.h lib*.dll lib*.lib文件复制到刚刚新建的工程的文件夹下,并且用添加—现有项   添加的工程中。(此处的*代表你的m文件名称


其中testmat3.cpp程序如下:

 

#include <stdio.h>

#include <string.h>

#include <iostream>

#include "mclmcr.h"

#include "matrix.h"

#include "mclcppclass.h"

#include "libMyAdd.h"

using namespace std;


int main()

{

double a = 6;

double b = 9;

double c;

// initialize lib,这里必须做初始化!

if( !libMyAddInitialize())

{

std::cout <<"Could not initialize libMyAdd!" << std::endl;

return -1;

}

// 为变量分配内存空间,可以查帮助mwArray

mwArray 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 \n" <<c<<std::endl;

// 后面是一些终止调用的程序

// terminate the lib

libMyAddTerminate();

// terminate MCR

mclTerminateApplication();

return 0;

}


7. 程序运行结果:

出现此结果基本上就说明混合编程成功了。


注:如果m文件中有画图方面的函数,则前边一定要有延时函数,或者在c程序中m函数调用后加上getchar(),否则当lib和MCR被terminated后图像会被关闭----即程序运行后会出现图像“一闪而过”的效果!


8. 参考资料:

(1)<<MATLAB2012a和VS2010混合编程的实现(Win7+32bit)>> by lihui-mn@163.com

(2)<<Matlab 与c++混合编程>> --------matlab r2011a and vs2010


以上过程其实还大可简化。如有问题,欢迎交流!

原创粉丝点击