C++与Matlab混编,调用生成的动态链接库
转载:http://www.zyh1690.org/c-calling-matlab-generated-dynamic-link-library/
平台
VS2010 SP1
MATLAB R2014a (64-bit)
Win8.1 x64
注意:因为需要用到mcc编译器,所以事先先用
!mcc
命令查看一下你的mcc编译器是否可用,部分未完全**的Matlab是不可用的,截止今日(2015/4/10),至少R2014b还是不可用的。
我的这个Matlab版本的下载地址:http://yunpan.cn/cV3jhWpvDkKuB 访问密码 629b
Matlab上的相关操作
1.编写.m文件
首先新建一个简单的Matlab程序,
1
2
3
4
|
function [c] = add(a,b)
c = a+b;
return;
end
|
2.设置Matlab编译器
在Matlab命令行窗口输入命令:mex -setup
如图,选择VC2010编译器。
接着输入mbuild -setup
命令,同样选择VC2010。
3.编译.m文件
在命令行窗口输入命令mcc -W cpplib:add -T link:lib add
前面的 add 是编译产生的文件名,后一个 add 指要编译的.m文件。
导出目录生成以下文件:
但我们需要使用的只是其中的 add.dll,add.lib,add.h 三个文件。
在VS2010上使用生成的动态链接库
1.配置VS2010
新建一个win32控制台应用程序(空项目),添加 MatlabAdd.cpp 文件,右键工程属性(或者快捷键 Alt+F7),
C/C++ -> 常规 -> 附加包含目录:
1 |
"D:\Program Files\MATLAB\R2014a\extern\include";
|
链接器 -> 常规 -> 附加库目录:(注意,我的系统是x64,Matlab是x64的,所以使用win64) ,后一个是我生成的动态链接库文件复制到的目录
1
2
|
"D:\Program Files\MATLAB\R2014a\extern\lib\win64\microsoft";
"D:\Project\CPlusPlus\MatlabAdd\MatlabAdd\Debug"
|
链接器 -> 输入 -> 附加依赖项:
1 |
mclmcrrt.lib;mclmcr.lib;add.lib
|
将add.lib add.h文件复制到你的工程目录,其中 .h 文件和 MatlabAdd.cpp 文件同目录, .lib 文件放到可执行目录中,也即Debug目录(需编译一次才会出现),.dll文件复制到system32目录(没错,即使你是x64的windows也要复制到这个目录,否则找不到,或者将你add.dll所在的目录添加到环境变量Path中,可能的原因是之前选择的是32位的C/C++编译器,产生的是32位windows动态链接库,所以要放在system32目录)
将 .h 文件添加到新建的项目,编写 MatlabAdd.cpp 文件中的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
#include "add.h"
#include <iostream>
using namespace std;
int main()
{
if(addInitialize()) //初始化,这一步是必须的
{
cout<<"success!!!"<<endl;
}
else
{
cout<<"fail!!!"<<endl;
return 0;
}
//定义3个mwArray类型变量,用于存放矩阵
mwArray a(2,3,mxDOUBLE_CLASS);
mwArray b(2,3,mxDOUBLE_CLASS);
mwArray c(2,3,mxDOUBLE_CLASS);
double x[] = {1,2,3,4,5,6};
double y[] = {7,8,9,10,11,12};
double *sum=new double[6]; //注意这个是*类型的
// 给输入 mxArray 对象赋值
a.SetData(x,6);
b.SetData(y,6);
//调用DLL函数
add(1,c,a,b);
//获取结果
c.GetData(sum,6);
//输出结果
for (int i=0;i<2;i++)
{
for (int j=0;j<3;j++)
cout<<sum[j*2+i]<<" ";
cout<<endl;
}
cout<<"it is successful !"<<endl;
return 0;
}
|
在x86平台下,到此应该就可以运行了,但因为我的是x64平台,所以编译时提示以下错误:
这是因为以上链接中采用的是 x86,此操作系统为 x64,MATLAB R2012a为 x64,解决办法:
打开属性页右上角的配置管理器,活动解决方案平台,选择新建,加入64位:
最后运行,看到运行画面:
成功!
Tips:如果还提示缺少dll文件,查找此dll所在的目录(推荐使用everything这个软件进行搜索),添加到Path环境变量中,或者复制到system32目录中。
参考文章:
http://blog.sina.com.cn/s/blog_a5fdbf0101018n91.html
http://blog.****.net/wuyeyoulan23/article/details/21076913
运行的时候会出现一个错误,说“缺少mclmcrrt7_17.dll,导致程序无法运行”,这个问题好解决,找到你的matlab安装文件下面的:D:\Program Files\MATLAB\R2012a\runtime\win32,注意,这个路径随每个人的安装不同,记得修改,在这个文件夹里面,你是不是看到了mclmcrrt7_17.dll这个文件呢,下面你只需要将这个文件所在的路径添加在系统环境变量中就可以了,也就是将D:\Program Files\MATLAB\R2012a\runtime\win32添加到系统变量PATH的路径中