zoukankan      html  css  js  c++  java
  • 基于GUI的mcc编译和dll生成

    基于GUI的mcc编译和dll生成

    1.mcc的编译

    1.1 MCRInstaller编译器的安装

    找到Matlab下的MCRInstaller,双击MCRInstaller编译器,运行安装。

    1.2编译语言的设置

    采用mbuild进行编译语言设定

    >> mbuild -setup
    MBUILD configured to use 'Microsoft Visual C++ 2015 Professional (C)' for C language compilation.
    
    To choose a different language, select one from the following:
     mex -setup C++ -client MBUILD 
     mex -setup FORTRAN -client MBUILD
    

    选择 mex -setup C++ -client MBUILD ,即C++语言进行设置,得到如下结果:

    MBUILD configured to use 'Microsoft Visual C++ 2015 Professional' for C++ language compilation.
    

    此时,用户可以采用Matlab生成exe文件,得到exe文件后,可以独立于Matlab运行。

    1.3生成exe文件

    输入如下代码:

    mcc -m untitled.m
    

    直到结束为止,则生成exe文件。

    2.dll生成

    开始的环境是win10 64、Matlab 2016b、VS 2015,死活不行呀,老是报引发的异常: 0xC0000005: 读取位置 0x0000000000000008 时发生访问冲突。最后不得已将VS2015换成了VS2013,就可以了^——^还要注意的是VS的编译平台要设置为64位的(我的Matlab为64bit)
    

    https://cn.mathworks.com/support/sysreq/previous_releases.html

    dll文件又称“应用程序扩展”,是软文件类型。

    2.1Matlab生成dll供Visual Studio调用

    2.1.1Matlab编译生成dll

    简单的加法运算

    function [c]=add(a,b)
        c=a+b;
        return ;
    end
    

    Matlab生成dll文件:

    mcc -W cpplib:add -T link:lib add.m
    

    生成了.dll、.h和.lib后缀的3个文件
    或者:使用deploytool(参考文献3

    2.1.2设置Visual Studio

    1. 启动Visual Studio,打开相应项目(或者新建一个项目)

      点击项目属性,在VC++中,选择包含目录和库目录。
    1:在项目属性中的包含目录添加“Matlab安装目录externinclude;”
    2:在项目属性中的库目录添加“Matlab安装目录externincludelibwin64microsoft;
    

     

    1. 进行链接器的设置,选择附加依赖项,设置函数库

    添加如下:

    add.lib       %加法器函数库文件
    mclmcrrt.lib   %VS 自带库文件
    mclmcr.lib    %VS 自带库文件
    
    1. 在项目头文件中加载add.dll和add.h文件,资源文件加载add.lib

    2. VS测试代码:

    #include<iostream>
    #include"add.h"
    #include"mclmcrrt.h"
    #include"mclcppclass.h"
    #include <stdio.h>
    using namespace std;
    
    void main()
    {
    	if (addInitialize()) {
    		//system("pause");
    		printf("welcome!!!
    ");
    	}
    	else {
    		//system("pause");
    		printf("fail
    ");
    	}
    	mwArray a(1, 1, mxDOUBLE_CLASS);//赋值
    	a(1, 1) = 1;
    	mwArray b(1, 1, mxDOUBLE_CLASS);
    	b(1, 1) = 1;
    	mwArray c(1, 1, mxDOUBLE_CLASS);
    	add(1, c, a, b);
    	cout << c(1, 1) << endl;
    	addTerminate();            //终止函数lib
    	mclTerminateApplication(); //终止MCR
    
    }
    

    2.2VS生成dll供Matlab调用

    2.2.1 VS准备工作

    1. 用VS新建一个Win32项目,选择dll,勾选空项目。
    2. 创建源文件。
      vs_add.cpp
    #include "vs_add.h"
    #include <stdio.h>
    float add(float x, float y){
    	return x + y;
    }
    

    vs_add.h

    #ifndef VS_ADD_H
    #define VS_ADD_H
    /*check if the compiler is of C++*/
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    	__declspec(dllexport) float add(float x, float y);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    
    1. 单击生成,在Debug目录下有vs2013_matlab2016b.dll

    2.2.2 Matlab调用dll

    将得到的dll文件,vs_add.h文件复制到Matlab工作路径。

    loadlibrary('vs2013_matlab2016b.dll','vs_add.h');
    %libfunctions ysw_VS2010_MATLAB2012B -full
    m=calllib('vs2013_matlab2016b','vs_add',1.1,2.1)
    unloadlibrary('vs2013_matlab2016b')
    

    参考文献:
    http://www.cnblogs.com/newpanderking/articles/4057977.html
    Matlab GUI入门与实战
    http://blog.csdn.net/u013920434/article/details/52077788

  • 相关阅读:
    nginx并发数设置_Nginx Ingress 高并发实践
    推荐一个国人开源的推荐系统
    异步并发利器:实际项目中使用CompletionService提升系统性能
    JDK中CompletableFuture类
    mysql日志redo log、undo log、binlog
    <a>标签下载文件 重命名失败 download 无效
    nginx geo黑名单
    夜莺微信报警-V3
    分布式事务的学习
    php实现AES/CBC/PKCS5Padding加密解密(又叫:对称加密)
  • 原文地址:https://www.cnblogs.com/boyiliushui/p/7838483.html
Copyright © 2011-2022 走看看