问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何vs2010mfc调用matlab 2010生成dll进行编程

发布网友 发布时间:2022-04-27 03:13

我来回答

1个回答

热心网友 时间:2022-06-25 07:49

通常在实现图像处理的算法时我们使用Matlab编程,因为它具有丰富的库函数以及操作方便,然而在工程项目中通常使用C/C++语言。如果我们将matlab代码完全重写成C++代码会很麻烦,最好的办法是借助matlab与C/C++接口将.m程序转成dll文件!
一、使用matlab将.m转成dll文件
1、在命令行中输入mex -setup
提示你是否要在本地安装matlab compilers,然后选择compiler类型,有matlab自带的编辑器以及检测到的其他编辑器,比如“Microsoft Visual C/C++ version 6.0 in E:\Program Files\Microsoft Visual Studio”,根据自己实际情况选择。
2、在命令行中输入mbuild -setup
这里的选项和上面类似,依次选择环境确定。
3、生成dll文件
一句命令mcc -W cpplib:add -T link:lib add.m
前面的add表示生成的dll文件名,后面的add.m顾名思义是.m文件名。生成后会多出8个文件,有用的是add.ctfadd.dll add.lib add.h4个文件,据说新版的Matlab不会生成.ctf文件。
二、VC6.0中调用生成的dll文件
上面生成的dll文件,我们可以借助VC6.0的Depends工具查看导出函数名,但是我们要调用导出函数必须要知道函数的形参返回类型等,这里要借助.h文件,它包含了导出函数的声明,下面以实例来讲解使用方法:
1、add.m文件
function [a,b]=add(x,y)
a=2*x+y;
b=3*y;
end

注意了add函数有两个返回值,可以猜测一下在C++中是如何处理的;
2、add.h文件
截取其中一段关键代码如下:
extern void add(int nargout, mwArray& a, mwArray& b
, const mwArray& x, const mwArray& y);

实际上函数的返回是变相的放到形参中的,依次是输出参数个数,输出参数,输入参数。PS 现在做的这个项目中用户自定义算法dll使用的规则和这里类似!
3、C++中调用dll文件
(1)新建空工程,将上面提及的4个文件放到工程目录下;
(2)VC++目录中包含目录:matlab 内的include目录
比如我的是 E:\MATLAB7\extern\include
(3)VC++目录中库目录:matlab 内的lib目录
E:\MATLAB7\extern\lib\win32\microsoft\msvc60,要根据VC++版本修改!
(4)工程属性-》连接-》输入-》附加依赖项
输入:add.lib mclmcrrt.lib mclmcr.lib,第一个是生成的。或者在预处理中加入下面代码
#pragma comment(lib, "mclmcrrt.lib")
#pragma comment(lib, "mclmcr.lib")
#pragma comment(lib, "add.lib")

4、C++代码
#include <iostream>
#include "add.h"
using namespace std;
int main()
{
if(!addInitialize())
{
cout<<"initilize failed!!!"<<endl;
return -1;
}

mwArray a(1,1,mxDOUBLE_CLASS);
mwArray b(1,1,mxDOUBLE_CLASS);

a(1,1)=20;
b(1,1)=30;

mwArray x(1,1,mxDOUBLE_CLASS);
mwArray y(1,1,mxDOUBLE_CLASS);

//输出参数个数,输出参数,输入参数。
add(2,x,y,a,b);

double *i=new double;
double *j=new double ;

x.GetData(i,1);
y.GetData(j,1);

cout<<"x="<<*i<<" y="<<*j<<endl;
getchar();
return 0;
}

注意:addInitialize()一定要!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
小白开始做牛腩烧番茄前,应该做哪些准备? 普洱茶不管是纯料还是拼配它本身就很有意思 普洱茶的纯料VS拼配,谁更值得珍藏? 为什么我们听到熟悉的歌曲的音乐会感觉在唱歌词呢? abs制动防抱死系统什么时候用到 请问有谁知道离朝阳北路的煊特嘉园(炫特区)最近的浩沙健身俱乐部在哪 ... 朝阳北苑郊野公园有哪些 北苑哪些公园 北京北苑健身有哪些 王者荣耀黄忠开大怎么转圈 MFC中如何调用C# DLL的属性和方法 关于在MFC中调用C#编写的dll的问题! 如何vs2010mfc调用matlab生成dll进行编程 如何在MFC中调用C#编写的DLL MFC Dll编程中全局变量theApp 不会和主程序产生同名冲突吗 mfc中dll创建//MFC 扩展DLL与共享MFC DLL有什么区别 MFC编程如何把dll封装入exe中 衣服标签上写兔毛皮的会是獭兔毛吗我买的衣服上写兔毛皮,但商家说是獭兔,说现在全部统一叫兔毛皮 最近在了解皮草行业,请问有没有介绍专业服务与皮草行业比较权威的资料... 请教MFC制作常规DLL的过程 MFC dll 的 建立 及 调用 大家谁知道有关服装上毛领的分类呀 一般的都会有羊羔毛 狐狸毛 獭兔毛 还有什么品种的呀 详细点介绍哈 关于mfc编程于mfc规则dll 流苏加兔毛中长版 农村信用社定期存单过期怎么取?需要密码吗? 农村信用社存单密印上面写任意二字是不是代表没密码? 继续在农村信用社卡里存钱用不用密码? 急!农村信用社的存折没有密码怎么办 请问大学生可以考什么证? 农村信用社定期储蓄单有密吗 怎么用MFC编程啊? MFC中如何将类封装成DLL并调用(用显式的方法) MFC如何调用DLL(VC++) 怎样在MFC中调用C#编写的DLL MFC DLL 中写如何写类,编译好的DLL中又如何引用这个类 MFC程序怎么封装成DLL VC中MFC源程序怎样生成DLL文件? 父母有房子,现在自己想买房子算是一套房还是二套房 已经签过购房合同并且房产局备案了,算第一套房吗? 夫妻二人名下各有一套房产算一套房还是二套房? 购房合同有未成年人的名字,成年后购房属于一套房还是二套房? 两个城市买房全部贷款,同时进行,全属于1套房吗? 小孩几岁买房算个人第一套房? 我们要买房子,算一套房还是二套房? 只要网签就算一套房吗 一套房共同产权的房,各占50%产权,再买房,算一套还是二套? 我购房的商品期房,未办房证,算第一套房吗? 名下有一套预告房子,在买房算第一套房吗? 在老家首次买房后,在北京买房能算第一套房吗? 我在农村有一套平房,在再城里买一套楼房,算第一套房吗?