Visual Studio 与 Matlab实现混合编程

环境:

Win10

vs2010

Matlab2015

里面有很多选做的内容,其中2、3必做

1.Matlab环境设置:

  (选做)我没有做这步,因为打mbuild -setup指令不识别,缺少SDK,但是可以正常调用Matlab,这步是其他方式调用Matlab中的一步,使用Matlab生成DLL文件,VS引用

       要建立独立运行的C应用程序,系统中需要安装Matlab、Matlab编译器、C/C++编译器以及Matlab C/C++数学库函数和图形库函数。
Matlab编译器使用mbuild命令可以直接将C/C++源代码编译为独立运行程序,在这些源代码中可以使用Matlab提供的接口来调用Matlab数学库函数。
       虽然生成的可执行程序可以脱离Matlab环境运行,但是它需要Matlab C/C++数学库文件或者图形库文件的支持才能运行。但如果C/C++源代码完全是按传统C/C++源代码语法规则编写,没有包含Matlab数学库和图形库的调用,则不仅可以独立与Matlab环境,也不需要那两个库函数的支持。

      在 Matlab 的Command Window 下输入命令。

       mbuild – setup

      操作过程如下图:

    然后输入命令

    mex – setup

    以类似的方法配置编译器。Matlab 的配置完成。

2.VS环境设置        (必做)

(1)设置Include 和Library 目录

    项目右键->属性->VC++目录->包含目录:添加

    <MATLAB>R2010bexternincludewin64   我的是:D:RUANJIANMatlabexternincludewin64

    <MATLAB>R2010bexterninclude           我的是:D:RUANJIANMatlabexterninclude

    项目右键->属性->VC++目录->库目录:添加

    <MATLAB>R2010bexternlibwin32microsoft    我的是:D:RUANJIANMatlabexternlibwin64microsoft

    <MATLAB>R2010bexternlibwin64microsoft

截图:

    :

(2)设置工程目录:      ( 我并没有设置)  

    项目右键->属性->C/C++->常规->附件包含目录:添加

    <MATLAB>R2010bexternincludewin64

    <MATLAB>R2010bexterninclude

     项目右键->属性->链接器->常规:添加

     <MATLAB>R2010bexternlibwin32microsoft

    <MATLAB>R2010bexternlibwin64microsoft

    项目右键->属性->链接器->输入->附件依赖性:添加  (必做)

    libeng.lib
    libmat.lib
    libmex.lib
    libmx.lib  

    注:1.lib文件包含在<MATLAB>R2010bexternlibwin64microsoft,可根据需要增减

           2.附件依赖性在VS2010前以空格隔开,在VS2010后使用;隔开。

    截图: 

 

我的截图:

    项目右键->属性->链接器->高级->目标计算机:更改(只针对64位WINDOWS)    (选做)

    MachineX86 -> MachineX64

    注:分析原因为MATLAB根据计算机平台选择了X64编译环境,如此处不修改会出现 错误3   

(3)配置管理器设置(只针对64位WINDOWS)                                                 (必做)

    生成->配置管理器->平台:更改

    Win32->X64

    注:分析原因为配合链接器中目标计算机的修改,如此处不修改会出现 错误4

    截图:

3.系统(Windows)环境设置   (必做)

   我的电脑->属性->高级系统设置->高级->环境变量->Path,添加:

     <MATLAB>R2010bin;<MATLAB>R2010bexternlibwin64microsoft;<MATLAB>inwin64

    注:1.Windows7的情况下,“用户变量”和“系统

变量”都需 添加,如不添加,运行时会出现 错误5

 

    2.哈哈,别忘记重启哈,重启后生效

  

    

   OK!配置就此结束,现在就开始engOpen吧!!对了,别忘记添加#include "engine.h"。

 例程:

#include <iostream>

#include "windows.h"

#include "math.h"

#include "engine.h"       //Matlab的头文件

int main ()

{

    const int N = 50;

    double x [ N ], y [ N ];

    int j = 1;

    for ( int i = 0; i < N ; i ++)

    {

        x [ i ] = ( i + 1);

        y [ i ] = sin ( x [ i ]) + j * log ( x [ i ]);

        j *= -1;

    }

    Engine * pEng = NULL ;

    //open engine

    if (!( pEng = engOpen ( NULL ))) 

    {

        std :: cout << "Openmatlab enging failed!" << std :: endl ; 

        system ( "pause" );

        return -1; 

    }

    mxArray * xx = mxCreateDoubleMatrix (1, N , mxREAL );

    mxArray * yy = mxCreateDoubleMatrix (1, N , mxREAL );

    memcpy ( mxGetPr ( xx ), x , N * sizeof ( double ));

    memcpy ( mxGetPr ( yy ), y , N * sizeof ( double ));

    engPutVariable ( pEng , "xx" , xx );

    engPutVariable ( pEng , "yy" , yy ); 

    std :: string evalString = "plot(xx,yy);" ;

    engEvalString ( pEng , evalString . c_str ());

    mxDestroyArray ( xx );

    mxDestroyArray ( yy );

    Sleep (3*60*100);

    //close engine                关闭Matlab 

    if ( NULL != pEng )

    {

        engClose ( pEng );

    }

    system ( "pause" );

    return 1;

}

效果;

附录:错误情况及解决

2.提示:“libeng.lib libmat.lib"无法打开       

解决:附件依赖性在VS2010前以空格隔开,在VS2010后使用;隔开。

3.提示:“  "error LNK2019: 无法解析的外部符号 _interp1Initialize,该符号在函..."”

解决:操作如2.VS环境设置中的(2) 项目右键->属性->链接器->高级->目标计算机:更改...及(3)

4.提示:“  "模块计算机类型“X86”与目标计算机类型“x64”冲突..."”

解决:操作如2.VS环境设置中的(3)

4.提示:“ 系统丢失libeng.dll..."”

解决:操作如 3.系统环境设置 

1.mbuild – setup后没有“VS2010”选项
解决:MATLAB 2010b 之后包含对VS2010编译器的支持,2010a及之前版本不包含支持。如果MATLAB环境较低,Matlab官方有一个补丁(http://www.mathworks.com/support/solutions/en/data/1-D5W493/?solution=1-D5W493)

源地址:http://blog.renren.com/GetEntry.do?id=721771317&owner=240190126

源地址:http://www.cnblogs.com/uniquews/archive/2012/12/27/2835923.html

原文地址:https://www.cnblogs.com/luoqingyu/p/6396250.html