新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)

引言

由于项目需要进行混合编程,我尝试过一些VS调用MATLAB的方案,之前由于需要使用Vega prime5.0的破解版,只能使用VS2008以及MATLAB2010a,比较稳定。现在更换了后处理软件,终于能摆脱老旧的VS2008了,直接使用VS2017(焕然一新的赶脚~),但是MATLAB还得用,并且为了保持32位的编译(debug win32),我必须保证MATLAB也要支持32位。

系统 win10 64位专业版+visual studio enterprise 2017+matlab2015b

从MATLAB官网找到了最后一版支持32位的R2015b,上面还有各版本对应的编译器情况,大家可以自行查看。
(系统和编译器版本要求)System Requirements and Supported Compilers

点开2015b的介绍可以看到它最高支持到C++2015 professional ,理论上应该无法成功进行引擎调用,我一开始尝试过,失败了一次,之后换了VS2015却依然在同样的地方失败,后来才知道不是因为版本的问题(失败的原因下文说)。换回VS2017后成功了。(所以我大概猜测这个表可能是用COM组件或者在MATLAB中把M文件编译成dll时候的限制,因为MATLAB混合编程有三种方法嘛,调用引擎是最简单的方法,可能鲁棒性比较好)
新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)_第1张图片

步骤

接下来就是经典的配置环节,我这里参考了其他的教程https://blog.csdn.net/zlase/article/details/78703617

1.程序安装

第一步就是安装VS2017和32位MATLAB2015b,我直接在微信公众号:软件安装管家 上搜索,都有教程。

2.项目创建

然后这个先放一放,在VS2017(下面简称VS)上建立一个新的项目。

想起来那时我半路初学的时候,懵懵懂懂连项目都不会创建,我还是写细一点吧。

可以创建一个控制台程序,这个运行后就是会出现一个黑底的框框。
新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)_第2张图片
创建完成以后就是这样的,你还可以自行添加一句
system("pause");

让黑框驻留,方便以后判断。
新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)_第3张图片
新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)_第4张图片

3.环境配置

然后就在项目中配置环境。
MATLAB想要调用成功,需要配置好四个部分:
附加包含目录(.h),附加库目录(.lib),附加依赖项(.lib) 以及可执行文件(.dll)

3.1附加包含目录

首先是附加包含目录
点击 项目-属性
新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)_第5张图片
来到C/C++ -附加包含目录
添加两条路径,这个路径是在你安装MATLAB的子目录下
E:\install\matlab2015b\extern\include
E:\install\matlab2015b\extern\include\win32
新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)_第6张图片

3.2附加库目录

其次是附加库目录

我们来到链接器 -附加库目录
新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)_第7张图片
添加两条路径,这个路径是在你安装MATLAB的子目录下
E:\install\matlab2015b\extern\lib\win32\microsoft
E:\install\matlab2015b\extern\lib\win64\microsoft

新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)_第8张图片

3.3附加依赖项

然后是 附加依赖项
我沿用之前版本的设置,但是从其他的教程看,应该不用这么多
libmx.lib
libmex.lib
libmat.lib
libeng.lib
mclmcr.lib
mclmcrrt.lib
复制进去
新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)_第9张图片

3.4可执行文件目录

最后是设置可执行文件(.dll),一个程序在运行的时候会调用大量可执行文件,这些文件的路径都存储在系统的环境变量-path中

PS.(其他有些教程上会说把所有的dll放到system文件夹中什么的,原理是一样的,那个文件夹已经在环境变量的path中了,我个人不太喜欢把不相干的东西放一起,单独设置的话比较清楚)
PSS.(还有一些教程说了另一种办法,就是把所有的dll放到这个项目所在的文件夹中,这个的原理应该是与项目同级的文件夹也默认能被调用)

下面看如何打开

此电脑-右击-属性
新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)_第10张图片
打开后你应该会看见红框内的两条路径,但是没有绿框内的,所以要添上绿框的路径
E:\install\matlab2015b\bin\win32

点击新建即可把路径复制进去
然后按上移把他们移到一起
点击确定-确定…
这里如果不放心就重启电脑一下,我不是很确定有没有必要重启
新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)_第11张图片
PS:这里我就可以说明之前为什么失败了,因为我原本安装的2010版本的环境变量路径在2015的的环境变量路径上面(新安装的程序默认在最下面)所以程序运行的时候会先使用靠上面路径中的dll文件,而我在设置了2015版本的库文件 包含文件等等等后却调用了2010的dll,版本冲突才会出错,出错会发生在程序运行以后(黑框出现后,MATLAB打开前)类似于这样:无法定位程序输入点XXXXXX于动态链接库XXXXXX.dll上(图侵删)
新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)_第12张图片

4.运行

言归正传,再有最后一步就可以完成啦
在我们的CPP文件中加上与MATLAB相关的头文件
新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)_第13张图片
添加几句代码打开和关闭引擎

	Engine* ep;

	if ((ep = engOpen("")) == NULL)
	{
		std::cout << "fail!\n";
	}
    std::cout << "Hello Matlab!\n";
	system("pause");

	engClose(ep);

点击运行,等待一会后会出现一个MATLAB小窗子,随后就成功了

当然第一次打开可能会很慢。
新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)_第14张图片

新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)_第15张图片
PS:这里我这傻唧唧的windows defender居然把生成的文件报了个毒,你要是遇到就暂时把它关了或者列白名单,不然可能会不太顺利
新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)_第16张图片

或者借用Zlase老哥的代码,Plot画个图也没问题

	Engine* ep;
	mxArray *x1 = NULL;
	mxArray *y1 = NULL;
	if ((ep = engOpen("")) == NULL)
	{
		printf("Engine Fail");
	}
	
	printf("Init Success");

	double x[5] = { 1.0, 2.5, 3.7, 4.4, 5.1 };
	double y[5] = { 3.3, 4.7, 9.6, 15.6, 21.3 };
	x1 = mxCreateDoubleMatrix(1, 5, mxREAL);
	y1 = mxCreateDoubleMatrix(1, 5, mxREAL);

	memcpy((void *)mxGetPr(x1), (void *)x, sizeof(x));
	memcpy((void *)mxGetPr(y1), (void *)y, sizeof(y));

	engPutVariable(ep, "x", x1);
	engPutVariable(ep, "y", y1);

	engEvalString(ep, "plot(x,y)");
	system("pause");
	engClose(ep);

新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎)_第17张图片
至于各个函数的功能,这篇就不介绍了,哈哈哈,第一次写这个博客

结语

本人水平有限,肯定有说错的地方,请大家指正呀~

转载请注明出处

你可能感兴趣的:(新手向-VS2017与MATLAB2015b(32位)混合编程(调用引擎))