实验室的一个项目需要调用matlab程序。经过再三考虑,决定使用vc调用matlab导出库的形式。而我主要负责与matlab程序结合的工作。以下是今天工作的简要总结。全当是个备忘吧。
1:在matlab中选择compiler。
在命令行窗口输入:mex -setup
按照提示选择vc6.0.由于使用的是matlab7,不识别vs2010和2008,无奈有装的vc6.0。但听说最新版的matlab可以识别。
2:选择builder.
输入:mbuilder -setup
同样选择vc6.0
3:生成dll。
输入:mex -W cpplib:mydll -T link:lib test.m
4:在vc中使用DLL。
1:配置环境
1:在vc++目录中
包含目录:1:生成的mydll.h所在目录。
2:matlab 内的include目录。
库目录:1:mydll.lib所在目录。
2:matlab的lib目录。
:2:在连接器-》输入-》附加依赖项
输入:mydll.lib mclmcrrt.lib mclmcr.lib
2:将mydll.h加入工程。mydll.dll和mydll.ctf放入工程目录。//不是仅仅需要.h和.dll文件吗?为什么还需要。ctf文件。不明白。
注意事项:
1:在main中调用mydll中的函数之前,一定要调用mydllInitilize()函数。否则将会出现错误。
如
int main()
{
if(!mydllInitlize())
{
cout<<"初始化失败!"<<endl;
return -1;
}
//调用dll中的函数。
return 0;
}
2:将.m文件导出dll库后,如果需要再次编译,一定要首先清空原来dll所在的目录,否则将会出现mexfunction entry point missing 的错误。具体原因不详,估计是新生成的文件覆盖原有文件失败。这都是血的教训啊。花了我大量时间找错。
3:在调用多个matlab导出的dll库时,连接过程中会出现LNK2005: void __cdecl mclcppMlfF multiply defined
即void __cdecl mclcppMlfF 重复定义的情况。采取#ifndef 。。。方法,不行。网上搜了下,有遇到类似情况的,但是那家伙也没有解决。后来搜LNK2005错误,有一大堆解决方案。最后采取在项目属性-》配置属性-》链接器-》命令行-》/force 强制系统忽略此错误来解决。不管如何至少解决了这个错误。
ithzhang
2012.4.7下午
2012.4.18补充