(个人总结)VC++调用Matlab生成的dll图文详解
来源:互联网 发布:ubuntu 开机任务栏没了 编辑:程序博客网 时间:2024/06/05 06:39
最近在Matlab中写了一个算法,需要封装成dll供VC++调用,按现有帖子的方法没有成功(也许和我的系统环境不同),但经过一番折腾终于搞定,特重写了帖子,与大家交流。参考资料:http://developer.51cto.com/art/200909/150944.htm
http://blog.csdn.net/nupt123456789/article/details/7463612
下面开始:
我的系统环境:winXPSP3,VC++6.0,Matlab7.1
matlab提供了丰富的程序接口,除了matlab最初的版本是用fortran写的之外,后来的版本都是用C写的,因此matlab很容易和C/C++联合起来使用。
matlab有着丰富的库函数,将这些库函数直接编译成dll(windows下是dll,linux下是类似于dll的另外一个东西),给C调用,可以加快工程进度。
步骤如下:
1. 设置matlab的编译器,使用外部的VC或者gcc等编译器。
2. 编译m文件成dll
3. 设置VC等的继承环境,设置C需要用到的静态库和动态库
4. 编写C调用dll
(二) 设置matlab编译器下面以一个很简单的加法函数为例,说明在VC6和matlab7.1下,怎么做混合编程。
(三) 编译m文件过程如下:
1. 在matlab的command window里面敲入mex –setup,matlab会列出所有电脑上所有的编译器。
2. 选择编译器,这里选择3,即VC63.完成之后,敲入mbuild –setup,选择build工具,matlab会列出所有的build工具,同样选择VC6
(四) 设置VC环境首先,写出matlab函数,一个很简单的加法函数,如下:
- function [c] = MyAdd(a, b);
- c = a + b;
保存为MyAdd.m
然后,进行编译,命令如下:
mcc -W cpplib:libMyAdd -T link:lib MyAdd
其中,mcc是matlab提供的编译命令(可以理解为gcc),对于这一点,matlab的帮助说明如下:
-W lib:string link:lib其中-W是控制编译之后的封装格式,cpplib,是指编译成C++的lib,cpplib冒号后面是指编译的库的名字,-T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字是后面的MyAdd,即你写的m函数的名字。
运行完之后,你的目录下面,将会出现以下一些文件:
编译完成之后,libMyAdd.h libMyAdd.lib libMyAdd.dll和libMyAdd.ctf这四个文件时我们在c++中调用所需要的;具体每一个文件的意思,请查帮助,这里只说其中很有用的几个: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);
这就是MyAdd的C函数的声明。
nargout表示输出变量的个数
a,b,c就是对应了m函数的几个变量
注意,a,b,c三个变量的类型是mwArray,这是matlab提供的一个特殊的变量类型。mwArray是一个类,具体可以查帮助。
有了上面的准备,需要设置VC环境。
1. 首先建立一个控制台空工程(这个就不详细讲了,太easy了)
2. 将matlab的头文件路径和对应的库文件路径包含到VC++6.0;在VC++6.0中,点‘工具’->‘选项’,然后在‘目录’选项卡中,将‘Include files’的最后一行,添加matlab相关的头文件;如我的matlab对应的路径为:C:\matlab71\extern\include(这个根据每一个人的安装目录可能不一样,自己去找吧),如下图将下拉框换为‘Library files’,将matlab相关的静态链接库的路径加入其中,我的是:C:\matlab71\extern\lib\win32\microsoft\MSVC71 ,如下图还要把Matlab编译生成的lib路径加入其中,如下图:3、添加main.cpp文件,并添加必须的头文件和静态链接库3.1、在工程中添加main.cpp文件,并按下图添加相关文件3.2、将matlab编译生成的libMyAdd.h libMyAdd.lib libMyAdd.dll和libMyAdd.ctf这四个文件拷贝到VB工程目录下,并将头文件和静态链接库添加到工程中,添加方法如下图:3.3、添加C++基本文件4、编写main函数,如下图:5、编译后运行程序,结果如下:6、关于mwArray类从上面的程序我们可以看出,c++与matlab函数数据传递是借助matlab定义的mwArray类完成的!该类支持的数据类型有:
/*typedef enum
{
mxUNKNOWN_CLASS = 0,
mxCELL_CLASS,
mxSTRUCT_CLASS,
mxLOGICAL_CLASS,
mxCHAR_CLASS,
mxVOID_CLASS,
mxDOUBLE_CLASS,
mxSINGLE_CLASS,
mxINT8_CLASS,
mxUINT8_CLASS,
mxINT16_CLASS,
mxUINT16_CLASS,
mxINT32_CLASS,
mxUINT32_CLASS,
mxINT64_CLASS,
mxUINT64_CLASS,
mxFUNCTION_CLASS,
mxOPAQUE_CLASS,
mxOBJECT_CLASS}*/
同时我们应注意:mwArray类定义的对象数组,其坐标仍然是从1开始,而不是像c++那样,从0开始!mwArray的更详细的用法,可以参看mclcomclass.h
- (个人总结)VC++调用Matlab生成的dll图文详解
- vc调用matlab生成的C++dll库总结。
- vc调用matlab生成的dll实例
- VC调用Matlab生成的DLL
- VC调用Matlab生成的dll
- VC++和Matlab混合编程(在VC中调用将.m文件生成的DLL)
- vc调用matlab的dll
- VC与Matlab混合编程(在VC中调用.m文件编译生成的DLL)
- VC++调用Matlab编写的DLL(混合编程)
- VC调用MATLAB 产生的dll文件
- 关于使用vc++调用matlab生成的dll传递数组的问题
- 关于使用vc++调用matlab生成的dll传递数组的问题
- VS2013调用matlab生成的dll
- matlab调用VS生成的DLL
- matlab调用c++生成的DLL
- matlab调用VS生成的DLL
- VC++ (MFC)调用 C#生成DLL的方法
- VC++ (MFC)调用 C#生成DLL的方法
- Dijkstra算法及性能评估
- android SpannableString 使用详解(给文本添加效果)
- linux之间文件传输图形界面工具gftp
- 初学opencv心得:图片拼接Stitcher函数
- codec engine工程中使用ccs下编译的lib库
- (个人总结)VC++调用Matlab生成的dll图文详解
- 6.18 Exiting Threads and Timers
- Hdu1015Safecracker(dfs)
- 达芬奇软件架构
- iOS如何将不可变变量改变成可变变量, deep copy objects into mutable
- 编程之美学习笔记2.1求二进制数中1的个数
- PAT Advanced Level 1007:Maximum Subsequence Sum
- 关于uboot.lds文件的分析
- 辨析--数组,指针