原文地址:VC调用Matlab编写的DLL
作者:小木头
一. 基本环境:
1. Microsoft Visual Studio 2008 SP1(VC++);
2. MATLAB Compiler Runtime;
3. OS:Windows XP。
二. 基本方法:
1. 经验说明:
首先值得说明的是,经过不断的尝试和搜集资料,发现要想在VC++中调用MATLAB编写的DLL,必须至少要有MATLAB Compiler Runtime环境,也就是说得先安装MCRInstaller.exe(约160M),当然,直接安装MATLAB R2009a(约4.0G)也可以。显然,如果您仅仅想用VC++调用MATLAB编写的DLL,安装MCRInstaller.exe 就足够了,安装完之后看一下系统环境变量的Path里是否已经添加了其路径,如果没有需手动添加,一般会有的。
此外,值得注意的是,我遇到了这样的情况:起初我只是安装了MCRInstaller.exe,此时VC++可以正常调用MATLAB编写的DLL,之后,我又想装下MATLAB R2009a,安装完之后奇怪的事情出现了,之前正常的调用,居然不行了,在调用libdrawAMResultsInitiali
ze()【其中:libdrawAMResults是DLL的名称】初始化lib时,返回值永远是false,无法正常调用了。又经过不断的尝试和搜集资料发现,应该是安装MATLAB R2009a的时候和之安装的MCRInstaller.exe 发生了“共享冲突”,之后,我将 MATLAB R2009a卸载了,卸载后一定用系统清理工具清理一下系统,可能是还有残存的注册表信息还是文件,会导致还是无法正常调用MATLAB编写的DLL,清理之后,奇迹再次发生了,又可以正常调用了。
2.调用细节步骤:
(1)将MATLAB生成的:*.h、*.lib、*.dll 三个文件拷贝到当前项目的目录下。
(2)设置VC++项目的属性:
首先,在“配置属性->C/C++->常规”的“附加包含目录”中添加MCR的include目录的路径,我的路径是:
C:Program FilesMATLABMATLAB Compiler Runtimev713externinclude 。如下图所示:
其次,在“配置属性->链接器->常规”的“附加库目录”中添加MCR的lib库路径,我的路径是:
C:Program FilesMATLABMATLAB Compiler Runtimev713externlibwin3 2microsoft 。如下图所示:
最后,在“配置属性->链接器->输入”的“附加依赖项”中添加DLL中和程序中所依赖的lib库名称【被调用的MATLAB DLL的lib也可以包含在这里,当然也可以直接通过“添加->现有项“到项目资源文件中】。如下图所示:
(3)VC++程序中的调用:
首先,包含所使用到的头文件,例如(我的libdrawAMResults DLL):
#include "libdrawAMResults.h"
#include "mclmcrrt.h"
#include "mclcppclass.h"
其次,正式调用:
//初始化MCR
if(!mclInitializeApplication
(NULL,0) )
{
MessageBox(_T("Could not initialize MCR!"));
}
//初始化lib
if(!libdrawAMResultsInitiali
ze())
{
MessageBox(_T("Could not initialize libdrawAMResults!"));
}
try
{
mwArray a(3,3,mxDOUBLE_CLASS);
//double ha[9]={0,0.953,-0.544,1.189,0.177,-0.358,0.358,1.811,-0.358};
//a.SetData(ha,9);
a(1,1) = 0;
a(1,2) = 1.189;
a(1,3) = 0.358;
a(2,1) = 0.953;
a(2,2)=0.177;
a(2,3) = 1.811;
a(3,1) = -0.544;
a(3,2)=-0.358;
a(3,3) = -0.358;
//上面两种方式初始化mwArray,得到的矩阵才是一样。
}
catch (const mwException& e)
{
MessageBox(_T("mwException!"));
}
3.致谢
感谢网友们发布的相关方面的经验分享给我的参考、指引和启发。谢谢!
1. Microsoft Visual Studio 2008 SP1(VC++);
2. MATLAB Compiler Runtime;
3. OS:Windows XP。
二. 基本方法:
1. 经验说明:
2.调用细节步骤:
(1)将MATLAB生成的:*.h、*.lib、*.dll 三个文件拷贝到当前项目的目录下。
(2)设置VC++项目的属性:
首先,在“配置属性->C/C++->常规”的“附加包含目录”中添加MCR的include目录的路径,我的路径是:
C:Program FilesMATLABMATLAB Compiler Runtimev713externinclude
其次,在“配置属性->链接器->常规”的“附加库目录”中添加MCR的lib库路径,我的路径是:
C:Program FilesMATLABMATLAB Compiler Runtimev713externlibwin3
最后,在“配置属性->链接器->输入”的“附加依赖项”中添加DLL中和程序中所依赖的lib库名称【被调用的MATLAB DLL的lib也可以包含在这里,当然也可以直接通过“添加->现有项“到项目资源文件中】。如下图所示:
(3)VC++程序中的调用:
首先,包含所使用到的头文件,例如(我的libdrawAMResults DLL):
#include "libdrawAMResults.h"
#include "mclmcrrt.h"
#include "mclcppclass.h"
其次,正式调用:
3.致谢