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

最近项目用到绘制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即可(参考上面的配置说明)。

猜你喜欢

转载自blog.csdn.net/a29562268/article/details/81784863