Matlab 2016a和VS2013混合Dll编程步骤

1. 从Matlab导出.m文件为Dll文件;

Step1:将Matlab工作路径转为目标.m文件所在文件夹,在控制栏输入“mex –setup”,弹出如下说明:

Matlab 2016a和VS2013混合Dll编程步骤_第1张图片

Step2:点击“mex –setup C++”,弹出如下说明,看到“MEX configured to use ‘Microsoft Visual C++2013 Professional’ for C++ language compilation”,说明配置好用C++语言进行编译;

Matlab 2016a和VS2013混合Dll编程步骤_第2张图片

  Step3:继续输入“deploytool”,弹出compile窗口,选择第三个,即Library Compiler;

Matlab 2016a和VS2013混合Dll编程步骤_第3张图片

  Step4:在弹出窗口中,左上角选择“C++ Shared Library”,右侧添加需要转换的.m文件,下面第一行输入转换后的Dll文件名,最后点击右上角“Package”对号,如果.m文件中包含其他.m文件中的函数,不用一起添加,Matlab会自动检测,然后在窗口下面框中显示出依赖文件;

 Matlab 2016a和VS2013混合Dll编程步骤_第4张图片

Matlab 2016a和VS2013混合Dll编程步骤_第5张图片

  Step5:生成后文件夹如下图所示,第一个文件夹中的exe文件用于程序发布时用,第二个文件夹中包含相当于release下得.h,.lib和 .dll文件,第三个文件包含测试用地.h,.lib和 .dll文件等文件,是测试需要的;

Matlab 2016a和VS2013混合Dll编程步骤_第6张图片

Step6:新建一个Win32控制台应用程序工程,自己命名,比如然后将for_testing文件中的 .h,.lib和 .dll文件拷到新建应用程序下和.cpp文件放在一起,如下图

Matlab 2016a和VS2013混合Dll编程步骤_第7张图片

2. 配置电脑系统环境变量和VS工程属性;

 Step1:在系统环境变量的Path中添加“Matlab安装目录\bin\win64;”

Step2:在项目属性中的包含目录添加“Matlab安装目录\extern\include;”

Step3:在项目属性中的库目录添加“Matlab安装目录\extern\include\lib\win64\microsoft;”

 Matlab 2016a和VS2013混合Dll编程步骤_第8张图片

Step4:在项目属性链接器输入中添加以下库名

libmat.lib

libmex.lib

mclmcr.lib

mclmcrrt.lib

libemlrt.lib

libeng.lib

libfixedpoint.lib

libcovrt.lib

Step5:为项目添加matlab生成的头文件(上面Step6中和cpp文件放一起的那个.h文件)。

3. 编写测试程序:

// cpp5.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include 
#include 
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"
#include "Mylib.h"
using namespacestd;
#pragma comment(lib,"Mylib.lib")
 
int _tmain(int argc,_TCHAR* argv[])
{
 
    if(!MylibInitialize())    //初始化
    {
        printf("Could not initialize addfunction!");
        exit(0);
    }
    printf("OK!");
    mwArray result(1, 1, mxDOUBLE_CLASS, mxREAL);
    mwArray a(1, 1, mxDOUBLE_CLASS,mxREAL);
    mwArray b(1, 1, mxDOUBLE_CLASS,mxREAL);
    doubledata1 = 2; double data2 = 3;
    a.SetData(&data1,1);
    b.SetData(&data2,1);
    result.SetData(&data2,1);
 
    f(1,result, a, b);  //调用自己用matlab写的函数
    x= a.Get(1, 1);
    y= b.Get(1, 1);
    z= result.Get(1, 1);
    printf("%lf\n", x);
    printf("%lf\n", y);
    printf("%lf\n", z);
    MylibTerminate();
    return0;
}


4.mwArray类常用方法的调用和问题;

   a. 将数组数据输入到mwArray变量中:

result.SetData(array,len);

     其中array是数组名,len是数组长度,如果是标量,如上面代码中所示;

   b. 获取mwArray中数据:

y =b.Get(arg1, arg2,…);

arg1是索引数目,后面输入参量是索引;

5. 常见问题汇总:

1. 系统变量一定不能多设,例如Matlab runtime路径设置一个就可以;Matlab安装目录下的bin\Win64路径只需着一个就可以,像…\lib和…\bin等母路径不必多加,多加反而画蛇添足,导致程序运行出现一系列莫名其妙的问题。还有链接器中输入项添加的.lib文件只需添加用到的库,没有用到的不要加,常用的就是libmx.lib,libmat.lib,mclmcrrt.lib,mclmcr.lib。

2. 上面添加include路径和lib路径是在VC++目录下,而不是在C/C++目录下,否则会出现程序崩溃问题;

3. 如果提示缺失”mclmcr.lib”,是因为没有配置系统环境变量;

4. 如果mwDLLInitialize初始化错误,程序编译无错误但运行出错,检查时候是系统环境变量添加冗余;

5. Matlab同样可以导出.Net架构下得Dll文件,以供C#语言调用,该过程比转为C++能用的Dll要简单,工程配置少,问题少。

你可能感兴趣的:(matlab混合编,VS2013)