您的位置:首页 > 编程语言 > MATLAB

windows 32/64位系统 VS2010调用MATLAB2012生成的dll方法

2016-01-22 21:56 676 查看
功能:MATLAB程序编译为dll供vs2010使用

系统:windows10 64位/windows 7 32位均可

工具:vs2010 matlab2012a

step1: 

       m文件准备,准备m文件一份,一定要是  function格式的,输入输出明确。这里我用到的是C(A,B,C);这个函数的功能就不过多解释了,总之有3个输入,在某个输入下有输出。

step2: 

       MATLAB的设置,m文件要变为dll需要使用MATLAB的mex功能。具体代码如下:

              >> mex    -setup   选择VS2010,一路y下去就可以了。

              >> mbuild -setup  选择VS2010,一路y下去就可以了。

              >> mcc -W cpplib:Mylib -T link:lib mym.m  (Mylib是你要存成dll、lib及h文件的名字,mym.m是原m文件的名字)

        根据机器的性能及m文件的复杂程度不同,这个过程可能时间很长,也可能马上就结束,但中间不会报错,耐心等待就行了。成功以后在m文件的当前文件夹下会生成一堆以Mylib为名字的文件,其中我们要用到的有h、lib和dll三个文件。

step3: 

       系统环境变量的配置,从这块开始32位和64位系统就有所不同了,因为MATLAB安装后32位和64位的机器下包含文件和库目录的文件有所不同。环境变量如何配置请百度。现在只说配置的内容:

       
注:如果不配置的话,VS下编译是没有问题的,但是运行时会报错,说你缺少各种库

       (1)32位系统

          用户变量path:...\MATLAB\extern\lib\win32\microsoft;

                                   ...\MATLAB\bin\win32

          系统变量path:...\MATLAB\runtime\win32;

                                   ...\MATLAB\bin;

                                   ...\MATLAB\extern\lib\win32\microsoft;

                                   ...\MATLAB\bin\win32

       (2)64位系统

          用户变量path:...\MATLAB\extern\lib\win64\microsoft;

                                   ...\MATLAB\bin\win64

          系统变量path:...\MATLAB\runtime\win64;

                                   ...\MATLAB\bin;

                                   ...\MATLAB\extern\lib\win64\microsoft;

                                   ...\MATLAB\bin\win64

step4: 

       VS添加MATLAB生成库:

       建一个vs控制台工程(有需要的话你也可以做MFC,但MFC下窗口数据的交互与MATLAB dll接口函数的数据交换会变量类型转换的问题,比较麻烦),然后将MATLAB编译好的那3个文件,h、lib和dll三个文件,复制到工程文件下,然后在工程中添加现有头文件,把.h文件添加进去。打开.h文件你会发现定义好的函数声明,比如我这里是C函数,可以在头文件里看到

             C(int nargout, mwArray& X, const mwArray& A, const mwArray& B, const mwArray&
C);

       这个函数共有5个变量,后3个是你m文件中本来的变量,nargout是在C中输出变量的个数, X是输出变量的矩阵,这个等下会说如何调用。

       VS工程文件配置( ...\是你MATLAB安装的位置):

                (1)属性 -> VC++ 目录 -> 包含目录, 添加 

            ...\MATLAB\extern\include\ 

            (2)属性 -> VC++
目录 - ->
库目录, 添加

            ...\MATLAB\extern\lib\win32\microsoft(64位改为win64)

              还要添加你MATLAB生成库的目录

            (3)属性 ->C/C++ ->
通用 -> 附加包含目录, 添加

            ...\MATLAB\extern\include\

            (4)属性 ->链接 ->
通用-> 附加库目录, 添加

            ...\MATLAB\extern\lib\win32\microsoft(64位改为win64)

            (5)属性 -> 链接->
输入 -> 依赖项, 添加

                          libeng.lib

                          libmat.lib

                          libmex.lib

                          libmx.lib

                          mclmcrrt.lib

                          mclmcr.lib

                          Mylib.lib  (你自己的库)

       VS工程新建一个cpp文件,头文件添加

#include <iostream>
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"
#include "mylib.h" (你自己h文件的名字)

        void main()

       {
if( !mylibInitialize())
{
cout<<"init error"<<endl;
}
// 为变量分配内存空间,可以查帮助mwArray
 
mwArray outstr;

         mwArray A(5, 1, mxDOUBLE_CLASS); // 5,1表示矩阵的大小(所有maltab只有一种变量,就是矩阵,
         mwArray B(5, 1, mxDOUBLE_CLASS);//为了和Cpp变量接轨,设置成1*5的矩阵,mxDOUBLE_CLASS表示变
量的精度)
        mwArray C(1, 1, mxDOUBLE_CLASS);
mwArray mwYT(1,1, mxDOUBLE_CLASS);
C(0,mwYT,A,B,C);
string a;
a=outstr.ToString();
//a = mwYT.Get(1, 1); //调用类里面的Get函数获取取函数返回值
cout<<a<<endl;
// 后面是一些终止调用的程序
mylibTerminate();
// terminate MCR
mclTerminateApplication();
}

如果运行没问题,恭喜成功
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息