VS中调用Matlab封装的库文件
简介
由于项目需要,要编写多线程实现功能,但Matlab天生多线程缺陷,查相关资料,可以通过Timer对象实现,但考虑到C++程序的高效性,且一直在使用C++,故决定将Matlab编译成C++可以调用的库文件,然后在VS下面调用Matlab程序,下面是在Matlab封装成库文件,以及VS调用Matlab库文件详细过程。
环境
系统:Win7(64位)、Matlab 2014Ra、VS2012
步骤
1)将Matlab中的.m文件编译成对应C++的库文件
Matlab编译简介
将Matlab中的.m文件编译成对应的C++库文件,需要利用对应的编译器mbuild。下面简要介绍一下mcc、mbuild、mex:
- mcc:将.m文件转换成C/C++文件和相应的Mex包裹文件(需要Matlab编辑器),但在特定条件下可以自动调用mbuild或者mex;
- mex:将C/C++文件(入口函数为mexfunction())编译成mex(dll)文件(需要C/C++编辑器);
- mbuild:将C/C++文件(入口函数为main())生成可独立运行的C应用程序(需要C/C++编辑器);
设置Matlab编译环境
安装mbuild,具体在Matlab命令控制台中输入如下命令:
mex -setup
然后选择与自己VS编译器相对应的编译器,选择C++编译环境即可。
使用mcc命令编译.m文件
编译要使用的matlab程序中.m对应的库文件,使用如下命令:
mcc -v -W cpplib:libname -T link:lib name.m
其中libname:为自己编译后的库名;name.m为对应所要封装成库的.m文件。
注意:开始在使用如上命令进行编译时,一直报如下错误:Test checkout of feature ‘Compiler’ failed,主要原因是安装的compiler破解不完全导致的,解决方法见如下网页:
http://blog.csdn.net/smilebluesky/article/details/42987985编译完成检查
编译完成后,将多出9个文件,分别为如下信息:libname.dll、libname.lib、libname.h、libname.cpp、libname.def、libname.exp、libname.exports、mccExcludeFiles.log、readme.txt。
虽然生成了9个文件,但在VS中只需要使用其中的三个文件,分别为:libname.h、libname.dll、libname.dll。
2)在VS2012下调用Matlab程序
在VS建立控制台的空项目
配置项目属性
VC++包含目录,主要是Matlab安装目录下的include目录和自己编译的库目录,具体如下:
E:\Program Files\MATLAB\R2014a\extern\include\win64 E:\Program Files\MATLAB\R2014a\extern\include 自己编译的头文件目录,按照自己实际存放的位置来填写即可。
VC++库目录,主要是Matlab安装目录下的lib目录,具体如下:
E:\Program Files\MATLAB\R2014a\bin\win64 E:\Program Files\MATLAB\R2014a\extern\lib E:\Program Files\MATLAB\R2014a\extern\lib\win32\microsoft E:\Program Files\MATLAB\R2014a\extern\lib\win32\lcc E:\Program Files\MATLAB\R2014a\extern\lib\win64\microsoft 自己编译的库文件目录,按照自己实际存放的位置来填写
C/C++常规
E:\Program Files\MATLAB\R2014a\extern\lib\win64\microsoft
链接器,添加依赖库,具体如下:
libeng.lib、libmat.lib、libmex.lib、libmx.lib、mclmcrrt.lib、mclmcr.lib、libname.lib
注意:上面的环境的配置时,有一些是可以没有,主要还是要看VS下建立的项目时32位的还是64位的,可以根据具体情况进行配置。此外上面自己编译的库可以不用填写相应的目录,但是这种情况下,需要将对应libname.dll、libname.h、libname.lib三个文件放在自己项目的目录下。
添加头文件并写main函数
在建立的项目中导入头文件,利用导入现有项目即可实现。然后编写对应的调用main文件即可。主要main函数中调用Matlab中的库文件,需要使用对应的输入输出参数对象,主要为mwArray等。
注意:代入自己编译生成的.h文件,可能出现一定的错误,如”const char *” 类型的实参与 “LPCWSTR” 类型的形参不兼容,此错误对应的是编码集的问题,VS中默认的编码集为Unicode编码,将其改为使用多字节字符集即可。具体为:项目->属性->配置属性->常规->字符集,更改即可。
参考文献
http://blog.csdn.net/leixiaohua1020/article/details/38318517