正文

VC++中编译MEX程序2006-09-22 12:04:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/embed/18649.html

分享到:

VC++中编译MEX程序

    1. 目的

    一般情况下,我们都是在MATLAB命令行或DOS命令行下编译MEX程序。
    所用的命令就是:mex filename.c

    这有很多不方便的地方:
        a. 虽然mex也可以编译C++的mex程序,但是它的主框架仍是C的
        a. 当程序有多个模块时,需要多次使用mex命令,操作很麻烦
        b. 不能利用VC特有的ClassWizard自动创建和维护类
        c. 不能用MFC类库编写应用程序
        d. 不能方便地进行类似VC的项目管理
        e. 等等...
    这样一个命令行的编程环境可能会大大束缚你的想象力...
    其实解决问题的方法很简单,下面以VC6环境为例详细解说如何在IDE中编译MEX程序。

    2. 步骤

    (1)准备工作 (这里假设MATLAB的路径为:C:\MATLAB)

    a. 由matlab.def创建库文件matlab.lib
        进入c:\matlab\extern\include目录,用lib命令生成matlib.lib
        C:\>cd \matlab\extern\include

        C:\MATLAB\extern\include>lib /def:matlab.def /out:matlab.lib
        Microsoft (R) Library Manager Version 6.00.8447
        Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

        LIB : warning LNK4068: /MACHINE not specified; defaulting to IX86
        Creating library matlab.lib and object matlab.exp

        C:\MATLAB\extern\include>
        警告信息不用理它。

    b. 修改mex.h
        该文件也在C:\MATLAB\extern\include目录
        找到这一行:void mexFunction(
        替换为 : __declspec( dllexport ) void mexFunction(
        另保存为 :mex_vc.h

    (2)启动VC,创建MFC AppWizard(dll)程序框架

    (3)设置系统选项

        a. 设定头文件和库文件路径
            菜单Tools->Options->Directories
            Include files:添加c:\matlab\extern\include
            Library files:添加c:\matlab\extern\include

        b. 设置编译连接选项
            菜单Project->Settings
            C/C++->Preprocessor definitions: 添加MATLAB_MEX_FILE
            Link->Object/Library modules: 添加matlab.lib
            注1. 其它优化、调试以及头文件、库文件等选项看情况调整
            注2. Release版在General->Microsoft Foundation Classes选项中,
            必须设置为Use MFC in a Static Library. 原因不明:(

    (4)编写DLL主程序

        a. 文件名要用.cpp为扩展名,头两行必须是:
            #include "stdafx.h"
            #include "mex_vc.h"

        b. 编写mexFunction函数,用如下格式声明:
            void mexFunction(
            int nlhs, mxArray *plhs[],
            int nrhs, const mxArray *prhs[])
            {
            ...
            }

    (5) 象普通VC的DLL程序一样继续编写其它部分程序,加入其它模块

    (6) 调试错误,用F7编译,生成DLL。我的例子:

    --------------------Configuration: MatWave - Win32 Release--------------------
    Compiling resources...
    Compiling...
    StdAfx.cpp
    Compiling...
    MatWave.cpp
    sample.cpp
    mex.cpp
    Generating Code...
    Linking...
    Creating library Release/MatWave.lib and object Release/MatWave.exp
    LINK : warning LNK4089: all references to "SHELL32.dll" discarded by /OPT:REF
    LINK : warning LNK4089: all references to "comdlg32.dll" discarded by /OPT:REF

    MatWave.dll - 0 error(s), 2 warning(s)

    大功告成,有两个警告,不理它。
    拿到MATLAB里面试试吧,不过要有非法操作和异常退出的心理准备哦:P

    另外:如果要在MATLAB运行中重新编译DLL,需先执行: clear mex

		而且试验发现,MATLAB_MEX_FILE可以不用加,而手册中提到的mexversion.rc是否加入project对程序没有什么影响。
 补充:

vc中编译,单步调试mex程序


 最好先具备如下基础:
     1.调试过dll程序;
     2. VC中编译过mex程序;
    3 . 任意一种开发工具中调试程序的能力;
    
     在VC中编译mex程序的配置步骤(如果已熟悉,跳过这段):
     1. mex -setup, mbuild -setup 选择vc编译器(这未必需要,matlab中编译肯定会有此步的);
     2. 创建DLL工程,在Project页面可以选择 MFC AppWizard(DLL);
     3. 选择静态链接MFC的DLL;
     4. 设定输出函数,在.def文件指定DLL的输出函数,mex程序为 mexFunction。类如如下:
        ; createFontBitmap.def : Declares the module parameters for the DLL.

LIBRARY      "createFontBitmap"
DESCRIPTION  'createFontBitmap Windows Dynamic Link Library'

EXPORTS
    ; Explicit exports can go here
mexFunction

     5. 环境设置
      可以在头文件中include,也可以在vc环境中,我习惯于在vc环境中设置:
      A.Tools--->Options--->Directories---->Show Directories for---->Include 然后选择 $MATLABROOT\EXTERN\INCLUDE;
      B. Tools--->Options--->Directories---->Show Directories for---->Library ,
 $MATLABROOT\LIB\WIN32\MICROSOFT\MSVC60或者是$MATLABROOT\LIB\WIN32\MICROSOFT\MSVC70,以及$MATLABROOT\EXTERN\LIB
      C. Project-->Setting, 在Link页面的Object/library modules填入 libmx.lib libmex.lib 等库,具体需要哪些库根据你的程序而定,目前这个就是上面这几个库。
    
     6. 写代码;
   
     7. 调试:
     A. 在debug模型下进行;
     B. Project--->Setting--->Executable for debug session 填入 $MATLABROOT\bin\win32\MATLAB.exe ( 其实自己运行工程(点那个go按钮(F5))也会弹出对话框让你选择,然后浏览到matlab.exe即可;
     C. 加断点;
     D. Go(F5),会提示说matlab不可调试,你不用管它;
     E. 在新启动的MATLAB进程命令窗中中调用mex函数
     余下的与任何开发平台的任何调试步骤类似

阅读(8434) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册