分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
发信人: roy (中国大兵), 信区: Matlab
标 题: VC++ 中编译 MEX 程序(zz)
发信站: 红果园 (2003年10月30日11:58:08 星期四), 站内信件
VC++ 中编译 MEX 程序
1. 目的
一般情况下,我们都是在MATLAB命令行或DOS命令行下编译MEX程序。 所用的命令就是
:mex filename.c 这有很多不方便的地方:
a. 虽然mex也可以编译C++的mex程序,但是它的主框架仍是C的 a. 当程序有多个模块
时,需要多次使用mex命令,操作很麻烦
b. 不能利用VC特有的ClassWizard自动创建和维护类
c. 不能用MFC类库编写应用程序
d. 不能方便地进行类似VC的项目管理
这样一个命令行的编程环境可能会大大束缚你的想象力... 其实解决问题的方法很简单
,下面以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:RE
F
LINK : warning LNK4089: all references to "comdlg32.dll" discarded by /OPT:R
EF
MatWave.dll - 0 error(s), 2 warning(s)
大功告成,有两个警告,不理它。 拿到MATLAB里面试试吧,不过要有非法操作和异常退
出的心理准备哦.
另外:如果要在MATLAB运行中重新编译DLL,需先执行: clear mex
在MATLAB中可调用的C或Fortran语言程序称为MEX文件。MATLAB可以直接把MEX文件视为它的内建函数进行调用。MEX文件是动态链接的子例程,MATLAB解释器可以自动载入并执行它。MEX文件主要有以下用途:
对于大量现有的C或者Fortran程序可以无须改写成MATLAB专用的M文件格式而在MATLAB中执行。
发信人: roy (中国大兵), 信区: Matlab
标 题: 在vc中调用matlab的方法
发信站: 红果园 (2003年11月09日14:53:14 星期天), 站内信件
Matlab提供了多种与C/C++混合编程的方式
目前实现的有以下一些。
1. COM组件编程。
在Matlab中,调用comtool工具,把.m文件编译成标准COM组件。
这种方式是Matlab主推的方式。
2. 用VC中的Matlab Addin,向导将.m文件直接编译成可执行文件。
这也是比较标准的做法。在实验中,没有遇到任何问题。
这种方法存在的问题是:生成的C语言代码基本不能改动,无法加入自己的代码。
如果不调用图形界面,可以加入自己的代码。
例如:其生成的主程序一般为
int main(int argc, const char * * argv) {
return mclMain(argc, argv, mlxReadd, 0, &_main_info);
}
不要调用mclMain函数,而是调用它带有原始接口的函数
void mlxReadd(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[])
通常可以。不过这样略去了一些初始化的过程。具体可以参考Matlab帮助。
自动生成的主程序做了如下工作。
1. Defines persistent/global variables
2. Initializes the feval function table for run-time feval support
3. Performs wrapper-specific initialization and termination
4. Initializes the constant pools generated by optimization
我要实现的是下面这种,我觉得最简单,适合编写控制台程序。
3. 直接写主程序,然后通过Matlab中编译的库机制,实现程序的混编。
由于Matlab不提倡这种调用,在v6.5版中,没有这部分的帮助。参考Matlab6.1中的
Compiler
手册的Mixing M-Files and C or C++ (P110)
主程序的写法的例子为:main.c
#include