设为首页 收藏本站
查看: 1061|回复: 0

Win7 32bit + Matlab2013b +Visual Studio 2010联合编程配置

[复制链接]

尚未签到

发表于 2015-5-17 08:07:51 | 显示全部楼层 |阅读模式
  

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

在 Matlab 的Command Window 下输入命令 ,配置生成器  
>> mbuild -setup  

Welcome to mbuild -setup.  This utility will help you set up  
a default compiler.  For a list of supported compilers, see  
http://www.mathworks.com/support/compilers/R2011b/win32.html

Please choose your compiler for building standalone MATLAB applications:

Would you like mbuild to locate installed compilers [y]/n? y   (注:若是第一次mbuild -setup,选n,再在给出的的选项中选择2010 compiler,要注意安装路径是否相符)
  

Select a compiler:
[1] Microsoft Software Development Kit (SDK) 7.1
[2] Microsoft Visual C++ 6.0
[3] Microsoft Visual C++ 2008 SP1
[4] Microsoft Visual C++ 2010
[5] Microsoft Visual C++ 2012

[0] None

Compiler: 4   
  

Your machine has a Microsoft Visual C++ 2010 compiler located at
E:\Program Files\VS2010. Do you want to use this compiler [y]/n? y

Please verify your choices:

Compiler: Microsoft Visual C++ 2010  
Location: E:\Program Files\VS2010

Are these correct [y]/n?  y  

****************************************************************************
  Warning: Applications/components generated using Microsoft Visual C++      
           2010 require that the Microsoft Visual Studio 2010 run-time      
           libraries be available on the computer used for deployment.      
           To redistribute your applications/components, be sure that the   
           deployment machine has these run-time libraries.                  
****************************************************************************


Trying to update options file: C:\Users\Yanlu\AppData\Roaming\MathWorks\MATLAB\R2013a\compopts.bat
From template:              E:\PROGRA~1\MATLAB~1\bin\win32\mbuildopts\msvc100compp.bat

Done . . .  
  

然后输入命令   >> mex – setup
  以类似的方法配置编译器。Matlab 的配置完成.

Welcome to mex -setup.  This utility will help you set up  
a default compiler.  For a list of supported compilers, see  
http://www.mathworks.com/support/compilers/R2011b/win32.html

Please choose your compiler for building MEX-files:

Would you like mex to locate installed compilers [y]/n? y

Select a compiler:
[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\MATLAB\R2011b\sys\lcc
[2] Microsoft Visual C++ 2010 in D:\Program Files\Microsoft Visual Studio 10.0
[3] Microsoft Visual C++ 2008 SP1 in E:\Program Files\Microsoft Visual Studio 9.0

[0] None

Compiler: 2  

Please verify your choices:

Compiler: Microsoft Visual C++ 2010  
Location: E:\Program Files\VS2010

Are these correct [y]/n? y  

***************************************************************************
  Warning: MEX-files generated using Microsoft Visual C++ 2010 require
           that Microsoft Visual Studio 2010 run-time libraries be  
           available on the computer they are run on.
           If you plan to redistribute your MEX-files to other MATLAB
           users, be sure that they have the run-time libraries.
***************************************************************************


Trying to update options file: C:\Users\Yanlu\AppData\Roaming\MathWorks\MATLAB\R2013a\mexopts.bat
From template:              E:\PROGRA~1\MATLAB~1\bin\win32\mexopts\msvc100opts.bat

Done . . .

**************************************************************************
  Warning: The MATLAB C and Fortran API has changed to support MATLAB
           variables with more than 2^32-1 elements.  In the near future
           you will be required to update your code to utilize the new
           API. You can find more information about this at:
           http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html  
           Building with the -largeArrayDims option enables the new API.
**************************************************************************  
  
  

  2.转化BoostImage.m文件
   mcc -W cpplib:BoostImage -T link:lib BoostImage -d F:\zhangying\xieyulin\MatlabToC\
  注:在此的m文件function最好对应end,否则容易出现 Error using mcc的错误。(但我碰到有个m文件仍不能转化成功,不知什么原因)
  其中,mcc是Matlab提供的编译命令,对于这一点,Matlab的帮助说明如下:
-W lib:string link:lib其中-W是控制编译之后的封装格式,cpplib,是指编译成C++的lib,cpplib冒号后面是指编译的库的名字,
  -T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字是后面的BoostImage,即你写的m函数的名字。
运行完之后,你的目录下面,将会出现以下一些文件:
  BoostImage.cpp
BoostImage.exp
BoostImage.dll
BoostImage.exports
BoostImage.h
BoostImage.lib
mccExcludedFiles.log
readme.txt
  具体每一个文件的意思,请查帮助,这里只说其中很有用的几个:
BoostImage.dll是编译好的动态库,BoostImage这个函数封装在里面,BoostImage.h是对应的头文件,在C里面调用这个函数的时候,需要include这个头文件在这个头文件的最后,你可以看到下面的内容:
extern  LIB_BoostImage_CPP_API void MW_CALL_CONV BoostImage(int nargout,  mwArray& output_im, const mwArray& input_im, const mwArray&  Mboost);
  这就是BoostImage的C函数的声明。nargout表示输出变量的个数,a,b,c就是对应了m函数的几个变量。
注意,a,b,c三个变量的类型是mwArray,这是Matlab提供的一个特殊的变量类型(在7.0的版本,编译之后,变量类型是mxArray)。mwArray是一个类,具体可以查帮助。

  2.系统环境设置
  

  我的电脑->属性->高级->环境变量->用户变量->PATH中添加路径:D:\Program Files\MATLAB\R2011b\bin\win32,重启生效。

  3.VS2010环境配置
  新建一个win32 控制台应用程序,命名为MatlabTest.
  右键MatlabTest解决方案->properties->VC++ Derections
  (1)在“Executable Directions”项目栏,添加:D:\Program Files\MATLAB\R2011b\bin\win32(注意:当前的Mathlab安装在D:\Program Files下面)
(2)在“include Directions”项目栏,添加:D:\Program Files\MATLAB\R2011b\extern\include
(3)在“Library Directions”项目栏,添加:D:\Program Files\MATLAB\R2011b\extern\lib\win32\microsoft
上述环境只需要配置一次。
  另参考:
http://blog.iyunv.com/stardust94605/article/details/8972064

  在此暂时先测试了VS2010调用matlab现有函数的功能:


// MatlabTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include   
#include   
#include   
#include "engine.h"   
#include "matrix.h"   
#pragma comment(lib,"libeng.lib")   
#pragma comment(lib,"libmx.lib")   
int main()  
{  
    Engine *ep;  
    int i , j ;  
    //show how to open MATLAB engine   
    //for remote ones:   
    //engOpen( ADDRESS OF REMOTE SYSTEM ) ;   
    if (!(ep = engOpen("\0"))){  
        fprintf(stderr, "\nCan't start MATLAB engine\n");  
        return EXIT_FAILURE;  
    }  
    //show how to create matrix   
    mxArray *Y = mxCreateDoubleMatrix(1 , 3 , mxREAL) ;  
      
    //show how to put data in matrix   
    double tmp[3] = {1.0 , 2.0 , 3.0} ;  
    memcpy(mxGetPr(Y) , tmp , sizeof(tmp)) ;  
    //show how to put variables in the Engine   
    engPutVariable(ep , "Y" , Y) ;  
    //show how to execute commands in MATLAB   
    engEvalString(ep, "X = ones(5,1) * Y");  
      
    //show how to get variables from the Engine   
    mxArray *X = engGetVariable(ep , "X") ;  
      
    //show how to manipulate dimensions   
    int dims[10] ;  
    int ndims ;  
    ndims = mxGetNumberOfDimensions(X) ;  
    printf("total number of dimensions is %d\n" , ndims) ;  
    memcpy(dims , mxGetDimensions(X) , ndims * sizeof(int)) ;  
    for ( i = 0 ; i < ndims ; i ++ ){  
        printf("dimension %d : %d\n" , i , dims) ;  
    }  
    printf("\n") ;  
    //show how the data is stored in the memory   
    double *p = (double*)mxGetData(X) ;      
    for ( i = 0 ; i < dims[0] ; i ++ ){  
        for ( j = 0 ; j < dims[1] ; j ++ ){  
            printf("%8.2f" , p[j * dims[0] + i]) ;  
        }  
        printf("\n") ;  
    }  
    //---important, to release resources   
    mxDestroyArray(X) ;  
    mxDestroyArray(Y) ;  
    //show how to hide and unhide MATLAB command window   
    printf("type RETURN to hide the MATLAB command window...\n") ;  
    getchar() ;  
    engSetVisible(ep , false) ;  
    printf("type RETURN to unhide the MATLAB command window...\n") ;  
    getchar() ;  
    engSetVisible(ep , true) ;  
    printf("type RETURN to END this program...\n") ;  
    getchar() ;      
    //remembering to close it is important .   
    //but if you are debugging your programs ,   
    //annotate the following line will save you a lot of time ,   
    //for you needn't to restart the Engine .   
    engClose(ep) ;  
      
    //when your work is accomplished , type "exit" in MATLAB command window   
    return EXIT_SUCCESS;  
}  


  
  
  

运行结果: DSC0000.jpg   

DSC0001.jpg
  

  若出现如下问题:
  error C2371: 'char16_t' : redefinition; different basic types   
  在混合编程中,也许会出现如下错误:
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
  C:Microsoft Visual Studio 10.0VCINCLUDEyvals.h(576) : error C2371: 'char16_t' : redefinition; different basic types
C:Matlabr2010aexternincludematrix.h(330) : see declaration of 'char16_t'
  &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;
  原因是VS2010中的yvals.h添加了char16_t的定义,而Matlab的matrix.h也包含对char16_t的定义,所以同时包含这两个头文件的话,会导致重复定义char16_t的错误。
  解决方案:
  参考:http://maciejgryka.com/bits/2011/09/char16_t-conflict-while-mexing-with-vs2010/
完全没有必要修改这两个头文件(以防修改之后,会在将来导致一些问题),只需要在包含matrix.h之前包含yvals.h即可。例如:
  #include
#if (_MSC_VER >= 1600)
#define __STDC_UTF_16__
#endif
#include "mex.h"
  注:mex.h 包含matrix.h。这就要求我们必须知道所包含的头文件是否包含matrix.h。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-67638-1-1.html 上篇帖子: 解决win7 seed-xdsusb2.0 无法安装驱动问题 下篇帖子: Win7 下安装Win8到U盘移动硬盘的方法 Windows To Go
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表