c++调用matlab函数 - dll方式

项目中遇到一个问题,需要用c++调用matlab程序,这里记录下整个过程。

准备环境

matlab 2014a
visual studio 2010
PS:版本问题要注意,之前是visual studio 2017,这个就一直报错(笑cry),matlab比较难安装,所以一般来说调节visual studio版本就好了。

matlab设置visual studio的c++编译

在MATLAB命令行输入:mex –setup;
然后命令行继续输入:mbuild –setup,选择已安装的VC编译器。

matlab 函数编译生成 dll

mcc -W cpplib:MatPredictGPS -T link:lib ../predict_gps.m

其中MatPredictGPS为生成的文件名
cpplib,是指编译成C++的lib
-T表示目标,link:lib表示要连接到一个库文件的目标
../predict_gps.m为需要生成dll的函数。

PS:如果predict_gps.m依赖其它matlab函数,可以将依赖的函数一并放在后面,用空格分开就好。

命令运行后生成以下文件:
c++调用matlab函数 - dll方式_第1张图片

编写c++调用dll

#include "stdafx.h"

#pragma comment(lib,"mclmcrrt.lib")  
#pragma comment(lib,"libmx.lib")  
#pragma comment(lib,"libmat.lib")  
#pragma comment(lib,"mclmcr.lib")  
#pragma comment(lib,"MatPredictGPS.lib")

#include "Afxwin.h"  
#include "mclmcr.h"  
#include "matrix.h"  
#include "mclcppclass.h" 

#include "MatPredictGPS.h" 
#include
#include

using namespace std;

int main() {

    if (!MatPredictGPSInitialize())
        return -1;
    char image_files[] = {"D:\\workspace\\matlab\\2.jpg"};
    mwArray arr(1,2,mxDOUBLE_CLASS);
    predict_gps(1, arr, image_files);
    MatPredictGPSTerminate();
    system("pause");
    return 0;
}

环境配置

上面的代码需要配置环境才能正常运行。
1.首先配置x64环境,如果你的电脑是32位,此步可以省略
c++调用matlab函数 - dll方式_第2张图片
2.右键项目,点击属性,在general里面的use of MFC选择in a shared dll
c++调用matlab函数 - dll方式_第3张图片
3.在c/c++ general下面设置additional include directory,主要添加matlab下面的链接库(请参考自己的matlab安装位置,我的matlab安装路径是E:/software/matlab),还有之前matlab生成的位置。
c++调用matlab函数 - dll方式_第4张图片
4.在Linker general下面设置additional Library directory,主要添加matlab下面的链接库(请参考自己的matlab安装位置,我的matlab安装路径是E:/software/matlab)
c++调用matlab函数 - dll方式_第5张图片

这样之后编译就会成功。

运行错误说明

直接运行上面生成的exe文件就会出现下面的错误:

c++调用matlab函数 - dll方式_第6张图片

解决方式是将matlab生成的文件中.dll .lib .h文件粘贴到c++编译得到的exe文件同意目录下,如下所示:

c++调用matlab函数 - dll方式_第7张图片

好了到此为止,这件事就算完成了,如果遇到其它问题请自行查找咯。

延伸学习

1.https://blog.csdn.net/wangrenbao123/article/details/70169029 两者在调用过程中的数据结构说明
2.https://blog.csdn.net/cppyin/article/details/6225596 VC2010中”Include Directories” 和 “Additional Include Directories”的区别
3.http://blog.sina.com.cn/s/blog_79ba23780101gpeh.html

参考:

1.https://www.cnblogs.com/jmliao/p/5575202.html
2.https://www.cnblogs.com/lidabo/p/3501270.html
3.https://blog.csdn.net/cppyin/article/details/6225596

你可能感兴趣的:(c++,matlab)