网上看了很多C++调用Matlab DLL文件的混合编程资料,都不是很全,特别是需要调用Opencv时,会遇到各种问题,需要很久才能解决,归根结底就是环境配置的问题。因此,现在写一个详细的步骤,希望给能看到的人一点帮助。
我的工作环境是Win10系统,Matlab64位,VS2010。 下面的配置工作会针对不同环境详细说明。
1、需要将编好的Matlab封装成一个函数,在函数中是可以用load等语句导入数据的,后续只需将load的文件一起打包即可。
2、将编好的Matlab函数,编译生成DLL文件。具体方法网上有很多,如:http://blog.****.net/scudz/article/details/13628917
3. 将生成的.dll,.h,.lib 三个文件以及需要导入的MATLAB数据文件(如.mat)一起放在C++工程文件下
4. 配置工程环境。
这一步是最麻烦的,如果环境没配置好,会出各种问题。 首先需要说明的是vs环境下,调用Matlab DLL需要工作在Release模式下,同时编译环境是X86还是X64需要根据你的Matlab的版本确定。如我的是Matlab 64位,因此生成的DLL是64位编码的,所以VS的环境应设置为X64。
这一步很重要,下面的配置都是基于编译环境配置的。
首先确认将Matlab的路径和Opencv的路径添加到环境变量中。
因为VS的工作环境是X64,因此添加到环境变量中的路径需要是64位的路径。 添加路径时根据自己软件的安装位置为准。
MATLAB:
如果是32位编译环境,添加对应的X86路径即可。
接着,需要配置VS工程环境。
打开项目配置界面,首先添加路径
Matlab:
D:\Program Files\MATLAB\R2015b\extern\include
D:\Program Files\MATLAB\R2015b\extern\include\win64
Opencv:D:\Program Files\opencv\build\include\opencv
D:\Program Files\opencv\build\include\opencv2
如下图
(此图中Opencv的路径在下面是因为我将Opencv的路径设置成了对所有工程有效的路径,将其路径添加到上面空白处不影响,下同。)
接着配置库文件路径
MATLAB:
接着添加外部库:
首先是和Matlab有关的两个
mclmcrrt.lib
mclmcr.lib
然后是你自己编译的Matlab 的.lib 如我的是: libRecognize.lib
同时还有Opencv的lib库,这里有一个重要的问题就是Opencv的lib要和自己的Opencv版本对应,同时因为是在Release模式下,因此其lib文件需要放不带d的,这一点很重要,不能将带d的和不带d的一起放进去,这样运行时会出错。
如下图
配置完工程环境后,要将编译好的.h 头文件导入工程中,注意是导入,只有导入后,在工程的源文件中才能看到你自己的.h文件 (或者将.h文件的路径添加到工程路径也可以)。
在需要用到的地方添加头文件,如#include"libRecognize.h"
到这里VS调用Matlab的环境配置好了,接着就是编代码了。
Matlab生成的.h头文件中,提供了两种调用我们编写的函数的方式。在头文件中,我们可以详细的看到这两个函数的声明,见下图:
我Matlab编写的函数名字是Recognize,在生成的libRecognize.h头文件中,有两个关于Recognize函数的声明。