VS系列编译器内部调用malab(32位/64位)函数指南

1 篇文章 0 订阅

  最近项目用到绘制3D图形,使用了许多开源库没有得到理想的效果,后来想到可以使用matlab软件绘制图形通过MFC项目工程进行调用。
  有了这个想法后,便在网上搜索相关的资料,实际调用matlab生成库时,没有简单的办法可以使项目编译成功,便采用MFC内部调用matlab函数的方式完成此功能。

  首先在电脑上安装matlab软件(我使用的win7 64位系统、VS2010编译器和Matlab R2014a编译器)
特别说明:xp系统以及win7 32位系统均可安装Matlab R2014a编译器;

  Matlab R2014a编辑器根据使用的系统位数自动安装为相应的位数,比如 win7 64位安装的Matlab R2014a为64位,而win7 32位、xp系统安装的Matlab R2014a为32位;

  MFC工程成功调用Matlab函数与系统位数有直接关系(win7 64位系统创建的MFC工程需要把工程改为64位,因为Matlab R2014a编译器为64位,需要用到的libeng.lib;libmx.lib;libmat.lib库文件系统自动生成为64位;如果使用32位系统,MFC工程则为32位,需要用到的libeng.lib;libmx.lib;libmat.lib库文件系统自动生成为32位);

  虽然不同位数的系统使用的MFC工程位数也不同,不过不会造成比较大的影响,MFC项目可以在不同位数的系统下移植(比如MFC64位工程移植到MFC32位工程只需要把matlab库文件替换为32位版本、修改包含路径以及使用Win32文件夹下dll就行)。


  下面采用64位系统为示例描述项目的编写过程,后续介绍32位系统调用方式:

    ①首先检查matlab编译器是否安装成功,启动matlab编译器
matlab安装成功
      可以进入这个界面说明安装成功。


    ②创建VS项目(可以是控制台或MFC项目),并配置matlab路径和库文件

      VS项目创建完成后,点击解决方案资源管理器 -> 项目名称 -> 右键 -> 属性->进入项目属性页:
这里写图片描述

      下面进行配置路径(我的电脑上matlab编译器安装在D:\matlab_路径,这里以D:\matlab_路径演示):

包含目录:
	D:\matlab_\extern\include;
	D:\matlab_\extern\include\win64;

库目录:
    D:\matlab_\extern\lib\win64\microsoft;
    D:\matlab_\extern\lib\win32\microsoft;

链接器->输入->附加依赖项:
	libeng.lib;libmx.lib;libmat.lib;

    ③修改解决方案平台为x64
这里写图片描述

点击Win32下拉框->配置管理器:
		在配置管理器中 点击平台下面的Win32下拉框(我这里显示的是x64)->创建x64。

    ④包含头文件

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "engine.h"
#include <matrix.h>

#include <mat.h>

#include "mclcppclass.h"

    ⑤增加测试代码

const int BUFFER_SIZE = 1024;
char buffer[BUFFER_SIZE];

mxArray *x1 = NULL;
	mxArray *y1 = NULL;
	mxArray *z1 = NULL;

	Engine *ep;
	if (!(ep = engOpen("\0")))
	{
		fprintf(stderr, "\nCan't start MATLAB engine\n");
		return ;
	}

	
	engOutputBuffer(ep, buffer, BUFFER_SIZE);
	printf("Init Success");

	double x[10] = { 22.5, 28.9, 26.7, 29.9, 32.6, 19.9, 20.1, 20.9, 29.5 , 19.99};
	double y[10] = { 68.8, 70.2, 59.9, 65.9, 79.9, 68.6, 59.5, 72.8 ,76.6 , 69.99};
	double z[10] = { 2.6, 3.5, 4.8, 5.9, 5.6, 6.9, 7.2, 8.6, 9.2 , 9.99};

	x1 = mxCreateDoubleMatrix(2, 5, mxREAL);
	y1 = mxCreateDoubleMatrix(2, 5, mxREAL);
	z1 = mxCreateDoubleMatrix(2, 5, mxREAL);


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

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

	//回调matlab函数
	engEvalString(ep, "surf(x,y,z)");
	engEvalString(ep, "shading interp");
	engEvalString(ep, "xlabel('X轴')");
	engEvalString(ep, "ylabel('Y轴')");
	engEvalString(ep, "zlabel('Z轴')");
	getchar();
	//释放对象时使用
	//engClose(ep);

    ⑥增加工程需要用到的dll文件

      现在开始执行工程提示缺少"xxx.dll"文件,缺少的文件在 "D:\matlab_\bin\win64"文件夹中找到并拷贝到工程的exe文件夹里(比如执行的Debug方式,需要把dll文件拷贝到与exe同一级的Debug文件夹内,示例工程为64位,需要拷贝到x64\Debug文件夹内):
这里写图片描述

    到此完成了项目的编写工作,可以正常加载matlab图形了。示例用到的工程,将在文章的结尾处贴上下载地址。

这里写图片描述

  32位系统配置方式与64位系统配置方式大致相同,只需要把路径"win64"改为"win32"即可:

    包含目录:
      D:\matlab_\extern\include;
      D:\matlab_\extern\include\win32;

库目录:
    D:\matlab_\extern\lib\win32\microsoft;

      开始执行工程提示缺少"xxx.dll"文件,缺少的文件在 "D:\matlab_\bin\win32"文件夹中找到并拷贝到工程的exe文件夹里(比如执行的Debug方式,需要把dll文件拷贝到与exe同一级的Debug文件夹内,实例工程为32位,需要拷贝到Debug文件夹内)。


  特别说明:剩下部分除了解决方案平台为Win32以外,直接使用64位系统做法即可。

  64位系统代码下载地址MFC内部调用matlab函数(32位/64位),如果系统为32位只需要修改包含路径以及找到win32使用的dll即可(参考上面的配置说明)。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坤昱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值