VC++调用matlab引擎方法设置(个人总结)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VC++调用matlab引擎找不到dll问题
最近尝试在Win7系统下,用VC++6.0调用MatlabR2010a引擎,正常配置后发现程序能够正常编译,但运行时报错如下,说找不到libmx.dll,网上查发现有不少人遇到这样的问题,有人说系统、软件都太新了,难免出问题,倒是有人提议系统变量路径配置不正确,尝试下确实可以。
下面把整个设置过程讲下:
要在VC中成功编译Matlab引擎程序,必须包含引擎头文件engine.h并引入Matlab对应的库文件libmx.lib、libmat.lib、libeng.lib。具体的说,打开一个工程后,做如下设置:
1) 通过菜单工具/选项,打开选项页,点击项目和解决方案,然后在页面右面“显示以下内容的目录”下拉列表框中选择“包含文件”,添加路径:"D:\Program
files\MATLAB\R2010a\extern\include"。
2) 选择“库文件”,添加路径:d:\Program Files\MATLAB\R2010a\extern\lib\win32\microsoft。
以上步骤1)、2)只需设置一次,因为是对VC++6.0整体工作环境的设置。
3) 右击工程/属性,打开项目属性页,选择链接器/输入,在附加依赖项编辑框中,添加文件名libmx.lib libmat.lib libeng.lib libmex.lib,中间用空格隔开。
步骤3)对每个项目都要单独设定。另外有一种比较简单的方法,可以自动加载lib库文件,在工程的stdafx.h中写入以下语句:
//自动连接Matlab库函数
#pragma comment(lib,"libeng.lib")
#pragma comment(lib,"libmx.lib")
#pragma comment(lib,"libmex.lib")
#pragma comment(lib,"libmat.lib")
4) 如此设置后,能够正常编译,但运行时报错还说找不到dll文件,如下
而libmx.dll是存在于D:\Program Files\MATLAB\R2010a\bin\win32文件夹中,而在Win7系统变量里Matlab在安装的时候时只写入了路径D:\Program Files\MATLAB\R2010a\bin,故系统不会自动到其子文件中找dll,从而报错说找不到文件,这也解释了为什么旧版本的Matlab 无此问题,因为可能旧版本的Matlab中没有将这些dll分离放到win32子文件夹中。所以只要在系统变量中包含路径D:\Program Files\MATLAB\R2010a\bin\win32即可,右击我的电脑选择属性\高级系统设置\环境变量\选择系统变量的新建如下图。
如果以上设置完成后,运行仍报错,可以尝试将VC++关掉再启动,我就是这样OK了!
单击画四朵花按钮,如图出现MATLAB绘图窗口:
void CMATLABEngineDlg::OnPlotFollwer()
{
// TODO: Add your control notification handler code here
if(!r)
{
MessageBox("没有启动matlab引擎!","MATLAB引擎",MB_OK|MB_ICONINFORMATION);
return;
}
//画四只花朵
engEvalString(ep,"z1=sym('(x^2+y^2)^(1/2)');");
engEvalString(ep,"z=sin(z1);");
engEvalString(ep,"subplot(2,2,1),ezsurf(z);");
engEvalString(ep,"z=sin(z1)*cos(z1);");
engEvalString(ep,"subplot(2,2,2),ezsurf(z);");
engEvalString(ep,"z=sin(z1)/tan(z1);");
engEvalString(ep,"subplot(2,2,3),ezsurf(z);");
engEvalString(ep,"z=cos(z1);");
engEvalString(ep,"subplot(2,2,4),ezsurf(z);");
}
void CMATLABEngineDlg::OnCancel()
{
// TODO: Add extra cleanup here
if(r)
{
engClose(ep);//关闭matlab引擎}
CDialog::OnCancel();
}