您现在的位置:首页 >> 技术文章 >> MATLAB技术 >> 内容

基于MATLAB编译产生的DLL源码程序

时间:2017-12-24 17:19:41 点击:

  核心提示:QQ :1224848052 微信:HuangL1121 邮箱:1224848052@qq.com...

不同的是我现在用的MATLAB是R2010b,而VC是6.0,两个产品时间间隔达10多年之久。taohe兄的实验环境是vs2005,MATLAB 2007b两个产品时间间隔还是比较接近的。
之前按照taohe兄帖子里的步骤实现,发现总是无法成功,出现N多各种奇怪错误,譬如:error C2065: 'mclInitializeApplication_proxy' : undeclared identifier 之类的奇怪错误提示(后来才知道这是 2008a以后,Mathworks公司对mclmcrrt.h 和 mclmcr.h头文件做了修改,要求mclmcr.h必须include在mclmcrrt.h之后。)
现将操作步骤写下:
1、编写测试m函数,这个不变,即如下:
function [y,z] = myadd2(a, b)
% dummy function, just to demonstrate the idea
y = a+b;
z = a+2*b;
end
复制代码
2、运行mbuild -setup设置好编译器后(我选的是vc6.0的编译器,没用MATLAB自带的),利用
mcc -W cpplib:libmyadd2 -T link:lib myadd2.m -C
复制代码
生成需要的libmyadd2.dll,libmyadd2.h,libmyadd2.lib,libmyadd2.ctf文件。(注意,R2010b下,mcc -W cpplib:libmyadd2 -T link:lib myadd2.m不再生成libmyadd2.ctf文件,需加-C选项)
3、VC下新建控制台程序,步骤如下:file>new,选择Win32 Console Application,右侧project name 填写
testmyadd2_r2010b
复制代码
,点击OK。
在下一个界面选“a simple application”finish点OK。
至此程序框架搭好,将libmyadd2.dll,libmyadd2.h,libmyadd2.lib和libmyadd2.ctf复制到testmyadd2_r2010b工程目录下。


并将libmyadd2.h添加到Header files组内。
4、进行项目必要的设置(注意这里和VC2005有较大不同)。vc主界面进入project>Settings,点C/C++选项卡,Category选择Preprocessor,Additional  include directories下填入如下路径
F:\MATLAB\R2010b\extern\include
复制代码
(注意2010b下该路径和之前也有不同)。
点“link”选项卡,Category选择General,在下面的Object/library modules 那栏的最后添加
libmyadd2.lib mclmcrrt.lib
复制代码
两个库之间以及和其他库以空格隔开。
然后Category选择input,Additional  library path下填写:
F:\MATLAB\R2010b\extern\lib\win32\microsoft
复制代码
,点击OK。
至此配置完毕
5、打开testmyadd2_r2010b.cpp文件,在#include "stdafx.h"后添加
#include <iostream>
#include "libmyadd2.h"
复制代码
(注意这里不再需要include  "mclmcr.h"和"mclcppclass.h"了,因为2010b生成的"libmyadd2.h"已经包含这两个头文件了)。之后在main函数里
return 0
复制代码
这句上面添加如下代码:
std::cout << "Hello world!" << std::endl;
        /* Initialize the MCR */ 
        if( !mclInitializeApplication(NULL,0) ) 
        { 
                std::cout << "Could not initialize the application!" << std::endl;
                return -1; 
        }

        // initialize lib
        if( !libmyadd2Initialize())
        {
                std::cout << "Could not initialize libmyadd2!" << std::endl;
                return -1; 
        }

        try
        {
        // declare and initialize a
        mwArray a(2, 2,  mxDOUBLE_CLASS);
        double *aData;
        aData = new double[4];
        int i;
        for( i=0; i<4; ++i)
        {
                aData[i] = 1.0*i;
        }
        // print output
        std::cout << "a = " << std::endl;
        std::cout << aData[0] << ",\t" << aData[1] << std::endl;
        std::cout << aData[2] << ",\t" << aData[3] << std::endl;

        a.SetData(aData, 4);

        // declare and initialize b
        mwArray b(2, 2,  mxDOUBLE_CLASS);
        b(1,1) = 11.;
        b(1,2) = 12.;
        b(2,1) = 21.;
        b(2,2) = 22.;

        mwArray y(2, 2,  mxDOUBLE_CLASS);
        mwArray z(2, 2,  mxDOUBLE_CLASS);

        // call the function
                myadd2(2, y, z, a, b);

        // copy data from mwArray to C++ objects

        // allocate outputs
        double *yData, *zData;
        yData = new double[4];
        if( yData == NULL )
        {
                std::cout << "Failed to allocate memory for yData!" << std::endl;
                return -1;
        }

        zData = new double[4];
        if( zData == NULL )
        {
                std::cout << "Failed to allocate memory for zData!" << std::endl;
                return -1;
        }

        // copy data from mwArray to C++
        y.GetData(yData, 4);
        z.GetData(zData, 4);

        // print output
        std::cout << "y = " << std::endl;
        std::cout << yData[0] << ",\t" << yData[1] << std::endl;
        std::cout << yData[2] << ",\t" << yData[3] << std::endl;

        std::cout << "z = " << std::endl;
        std::cout << zData[0] << ",\t" << zData[1] << std::endl;
        std::cout << zData[2] << ",\t" << zData[3] << std::endl;

        
        // deallocate memory
        delete [] aData;
        delete [] zData;
        delete [] yData;
        }
        catch( const mwException& e)
        {
          std::cerr << e.what() << std::endl;
                  
        }
        // terminate the lib
        libmyadd2Terminate();

        // terminate MCR
        mclTerminateApplication();

作者:基于MATLAB编译产生的DLL源码程序 来源:基于MATLAB编译产生的DLL源码程序
  • 您是如何找到本站的?
  • 百度搜索
  • Google搜索
  • 查阅资料过程中
  • 论坛发现
  • 百度贴吧发现
  • 朋友介绍
本站最新成功开发工程项目案例
相关文章
  • 没有相关文章
相关评论
发表我的评论
  • 大名:
  • 内容:
  • matlab代做|matlab专业代做|matlab淘宝代做(www.hslogic.com) © 2019 版权所有 All Rights Reserved.
  • Email:highspeed_logic@163.com 站长QQ: 1224848052

    专业代做/代写/承接、MATLAB、SIMULINK、FPGA项目、博士/硕士/本科毕业设计、课题设计、论文,毕业论文,Coursework、Eassy、Assignment