c++与matlab联合编程,调用Deploytool 生成exe文件和dll文件
Posted on 2012-12-25 13:25 xlw1219 阅读(3464) 评论(0) 编辑 收藏 举报首先必须知道联合编程需要知道的一些命令解释:
mcc 的作用是将 .m文件编译为 c/c++动态链接库文件,使你可以在 c/c++程序中使用 matlab的一些函数功能。mcc 也可以将.m文件编译为exe可执行文件。
mex 的作用是将 c/cpp文件编译为 .m 文件可以调用的库文件,在Windows操作系统里通常是以mexw32或mexw64为扩展名,让你可以使用 c/c++来扩展 matlab,即在matlab中调用C/C++编写函数的功能,达到增加新的功能或者加速原有程序的功能。
mbuild 的作用是将 matlab视为一个 c/c++编译器,使用mbuild可以将 c/c++编译为 exe可执行文件,特色在于可以调用 matlab的数学库和图形库,但这样需要使用 matlab提供的动态连接库才能运行。
--------------------------------------分割线-----------------------华丽转身-------------------------------
在做matlab和C#混合编程时要对系统进行设置。比如我要用deploytool生成c++的动态链接库(下面有图),必须先要运行mbuild -setup命令。
但是有时会出现找不到vs的情形。例如:
>>mbuild -setup
Please choose your compiler for building standalone MATLAB applications:
Would you like mbuild to locate installed compilers [y]/n? y
Select a compiler:
[1] Lcc-win32 C 2.4.1 in E:\PROGRA~1\MATLAB\R2008a\sys\lcc
[0] None
Compiler:
同样的事情也可能出现在mex -setup命令上。
>>mex -setup
Please choose your compiler for building external interface (MEX) files:
Would you like mex to locate installed compilers [y]/n? y
Select a compiler:
[1] Lcc-win32 C 2.4.1 in E:\PROGRA~1\MATLAB\R2008a\sys\lcc\bin
[0] None
Compiler:
如上,可能我们即使在机子上安装了vs,将仍然找不到它。
原因在于,在用mex配置c++编译器时,mex首先检查系统是否安装了vs ,然后再检查版本是否正确。具体方法是:调用vs安装目录下的/VC/bin/c1.exe.它会输出一堆字符,然后在其中查看是否有“Version 版本号”,如果有就判断版本正确,否则就会出现上面的情形。而我们大部分都是安装的中文版,在中文版中,调用c1.exe后输出的相应字符是“版本号+版 ”,例如:“用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 14.00.50727.762 版”
显然没有“Version 版本号”出现。
解决方法是:(1)安装vs2008英文版,使用此方法即可以解决问题;
(2)下载附件mexsetup,解压到matlab安装目录下的bin文件夹中;
附件请移步到我的微盘:http://vdisk.weibo.com/s/lF3Og
这种方法我试过,确实,使用mex -setup命令的时候它起作用了,但是mbuild -setup依旧有问题。
后来试了下同事的电脑,发现不用做任何配置,以上命令都没有任何问题。他的电脑是vs2010+matlab2009b,我的是vs2008+vs2010+matlab2012a,都是xp系统。
所以还是建议重装软件比较实在。
---------------------------------我又来了-----------------------------------------------------------------------
但是我其实是很不愿意重装系统的,看到deploytool里面有直接生成exe文件,决定试下。如上图第一个选项。
竟然什么都不用配置,生成工程后直接编译通过(可参考我之前的文章)。生成的distrib文件夹里面只有两个文件,但是如果不是在本机上运行,额外加装matlabmcr是必须的。
后面的工作就很简单了,新建个c++工程,把生成的fall.exe加到工程里,写上:
#include <windows.h>
int main()
{
system("fall.exe");
}
一次性运行通过。