MATLAB2014aC++代码生成,并用VC2010生成dll供VBA或VB调用使用说明
在VS2010中调用MATLAB生成的DLL
在VS2010中调用MATLAB生成的DLL最近需要制作一个C的插件,需要使用MATLAB代码,所以想通过C语言调用MATLAB的动态链接库实现。
以下实现过程参考了MATLAB的help~编译环境:MATLAB2014a、Visual Studio20101.首先,在MATLAB中新建一个.m文件,命名为dll_test.m并保存,内容如下:function c = dll_test(a) %#codegenc = sqrt(a);end2.使用codegen命令生成DLL:这里先简单介绍一下codegen命令:o codegen命令用于从MATLAB代码获取C/C++代码,常见的两种命令格式:o codegen options file file1_name args...filen_name argscodegen project_name其中第一种用于处理文件,第二种用于处理工程;参数args表示示例输入,并不进行真正的参数传递;参数files是生成C/C++时需要包含的文件(.c/.cpp/.h/.obj/.lib/.tmf);options规定了生成的目标代码类型(dll/exe/lib/mex),命令为-config:dll(其他类似),具体命令解析可以在MATLAB命令行输入help codegen查看;o将当前路径更改为.m文件的保存路径,然后在命令行中输入以下命令:o codegen -report -config:dll dll_test -args {0}其中-report可以产生一份生成状态的报告:生成成功后的文件或错误报告;生成错误的话,重选路径,注意args与参数{0}之间有空格,多个参数空格分隔;3.上一步成功之后在目录./codegen/dll/dll_test下可以看到生成的所有文件。
在VS2010下新建一个控制台工程,将之前生成的依赖文件dll_test.dll拷贝到工程目录下,并且添加一个c/c++文件到工程中,内容如下:4.#include "dll_test.h"5.#include "dll_test_initialize.h"6.#include "dll_test_terminate.h"7.#include <stdio.h>8.9.int main()10.{11.dll_test_initialize();12.printf("%f\n", dll_test(25));13.dll_test_terminate();14.//gerchar();15.return 0;}•VS默认配置是Win32 Debug模式,根据你之前生成的DLL,选择win32 Release还是x64 Release;•选中VS项目,右键->属性,选择C/C++ ->常规->附加包含目录,添加目录 ./codegen/dll/dll_test;选择链接器->常规->附加库目录,添加路径同上;选择链接器->输入->附加依赖项,将dll_test.lib加入;确定;•VS配置完成,完美运行~。
Matlab环境下调用通用DLL的方法及应用
浙江省国土资源厅关于印发《浙江省土地登记办法实施细则》的通知文章属性•【制定机关】浙江省国土资源厅•【公布日期】2003.04.08•【字号】浙土资发[2003]38号•【施行日期】2003.04.08•【效力等级】地方规范性文件•【时效性】失效•【主题分类】土地资源正文浙江省国土资源厅关于印发《浙江省土地登记办法实施细则》的通知(浙土资发〔2003〕38号)各市、县(市、区)国土资源局:为适应社会主义市场经济发展的需要,加强土地产权管理,促进土地登记规范化建设,省厅制定了《浙江省土地登记办法实施细则》,现印发给你们,请遵照执行。
在实施过程中有什么问题和建议,请及时反馈厅地籍管理处。
二○○三年四月八日《浙江省土地登记办法》实施细则第一章总则第一条根据《浙江省土地登记办法》(以下简称《办法》),制定本细则。
第二条《办法》所称的土地登记包括国有土地使用权、集体土地所有权、集体土地使用权、土地他项权利的设定登记和变更登记,用途、名称、地址、法定代表人、使用条件等变更登记以及注销、更正及其他登记。
第三条土地登记工作由县级以上人民政府土地行政主管部门负责。
由省人民政府土地行政主管部门负责的省级国家机关、省属企业事业单位和社会团体以及中央直属企业事业单位依法使用本省行政区域内的国有土地的登记发证工作,除需要省土地行政主管部门直接办理外,委托土地所在地市、县人民政府土地行政主管部门办理,登记后及时抄告省土地行政主管部门。
第四条土地登记卡是土地登记的主件,是土地权利设定、转移、变更、终止等的法律依据。
土地使用权、所有权和土地他项权利的设定、变更或注销,都应在土地登记卡上记载,并应有取得土地登记上岗资格的经办人、审核人签字盖章。
第二章土地登记类型第五条依法使用划拨国有土地的,土地使用者应在实地定点放样之日起或批准使用之日起30日内申请划拨国有土地使用权的设定登记。
依法有偿使用国有土地的,应当按照有偿使用合同约定,支付土地使用权出让金(有偿使用费)后30日内申请国有土地使用权设定登记。
matlab生成dll 分享
一、生成独立可执行的程序(exe文件)步骤
1. mex -setup; 选择编译器vc6.0
2. mbuild –setup;选择vc6.0
3.mcc -m filename;filename为已经存在的filename.m 。
4、安装MATLAB7\toolbox\compiler\deploy\win32目录下的MCRInstaller。
二、脱离matlab运行可执行程序
MCR是由matlab的运行环境,占用不到400M的对于用不同matlab版本生成的exe 文件,MCR版本也会有不同,因此,在程序打包时,最好将相应版本的MCR一起打包。
MCR环境的设置文件存放目录如下:
\MATLAB\R2007a\toolbox\compiler\deploy\win32
文件名为MCRInstaller.exe。
可将其拷贝到自己的文件夹中。
在其它机器上运行exe文件前,首先安装matlab的运行环境。
在同一机器上可以并存不同版本的matlab环境。
Note: 将MCRInstaller.exe拷贝到你文件所在文件夹里,用打包程序来打包,生成安装文件,设定在解包过程中自动执行MCRInstaller.exe,同时将可执行文件的图标放在桌面。
VS2010调用Matlab引擎的简单例子
engClose(ep); //关闭Matlab引擎。
}
5
6
无法调试。
mxArray*xx =mxCreateDoubleMatrix(1,N,mxREAL);
mxArray*yy=mxCreateDoubleMatrix(1,N,mxREAL); //同上。
memcpy(mxGetPr(xx), x, N*sizeof(double)); //将数组x复制到mxarray数组xx中。
using namespacestd;
intmain()
{
constintN = 50;
double x[N],y[N];
intj = 1;
for (inti=0;i<N;i++) //计算数组x和y
{
x[i] = (i+1);
y[i] = sin(x[i]) + j * log(x[i]); //产生-之间的随机数赋给xx[i];
memcpy(mxGetPr(yy), y, N*sizeof(double)); //将数组x复制到mxarray数组yy中。
engPutVariable(ep, "xx",xx); //将mxArray数组xx写入到Matlab工作空间,命名为xx。
engPutVariable(ep, "yy",yy); //将mxArray数组yy写入到Matlab工作空间,命名为yy。
或者直接从工具栏平台的下拉箭头下进入:
(2)增加x64平台
确定,得到如下结果。
3
项目属性——》VC++目录,如图:
包含目录增加:C:\Program Files\MATLAB\R2012b\extern\include
matlab c编译
matlab c编译
MATLAB C编译是将MATLAB代码转换为C代码的过程,以便将其集成到其他应用程序或系统中。
以下是MATLAB C编译的一般步骤:
1. 编写MATLAB代码:首先,您需要编写要在C中编译的MATLAB代码。
这可以是任何有效的MATLAB脚本或函数。
2. 使用MATLAB Coder生成C代码:MATLAB Coder是MATLAB的一个附加工具包,它可以将MATLAB代码转换为C和C++代码。
要使用MATLAB Coder,您需要安装它,并确保您的MATLAB版本与您的C代码生成器兼容。
3. 打开MATLAB Coder应用程序:在MATLAB中,打开MATLAB Coder 应用程序。
您可以通过在命令窗口中键入“coder”来打开它。
4. 配置生成选项:在MATLAB Coder中,您需要配置生成选项。
这包括指定要生成的代码类型(C或C++),指定输入和输出文件的路径,以及设
置其他选项。
5. 生成C代码:在配置好生成选项后,您可以生成C代码。
在MATLAB Coder中,选择“Build”选项,然后选择“Build All”以生成C代码。
6. 使用生成的C代码:生成的C代码将保存在您指定的输出文件中。
您可
以在其他应用程序或系统中使用此代码,就像使用任何其他C代码一样。
需要注意的是,不是所有的MATLAB函数都可以转换为C代码。
一些特定的函数和操作可能无法被转换为C代码,或者转换后的效果可能不如在MATLAB中直接执行。
此外,生成的C代码可能需要特定的编译器和工具链才能正确编译和运行。
Matlab调用VC生成的dll的具体步骤
Matlab调用C生成的dll的具体步骤一、C生成dll文件(以vs2008为例)1创建项目: Win32->Win32项目,名称:MyDLL2新建头文件testdll.h,并编写相关程序注:一定要注意头文件的写法,此法是支持C的头文件,Matlab调用DLL只支持用C 语法写成的DLL,C++的一些关键特性如类、继承等都不支持,用起来的话局限性很大的,还不如单独再用M文件把算法再写一遍进行仿真呢。
具体程序如下#ifndef MATLABDLLTEST_H#define MATLABDLLTEST_H#ifdef __cplusplusextern "C"{#endif__declspec(dllexport) double add(double x, double y);#ifdef __cplusplus}#endif#endif3新建源文件testdll.cpp,并编写相关程序具体程序如下所示:#include "stdafx.h"#include "testdll.h"double add(double x, double y){return (x+y);}4新建模块定义文件mydll.def,并编写相关程序二、Matlab调用生成的dll1、编译器准备1)在Matlab的命令窗口输入:mex -setup2)选择你的编译器,我的是:[2] Microsoft Visual C++ 2008 SP1 in c:\Program Files\Microsoft Visual Studio 9.02、加载DLL:把编译连接之后产生的myDLL.dll和testdll.h文件拷贝到Matlab的当前工作目录下,并编写.m函数具体程序clc;clear all;close all;addpath('dll的具体路径即Matlab的当前工作路径')%输入dll文件具体的存储路径loadlibraryMyDLLtestDLL.h alias lib%加载MyDLL库,并重命名为lib,注意加载时常常需要MyDLL的头文件libfunctionsview lib %执行此命令后会生成如下窗口calllib('lib', 'add', 1.0,2.0)%只有出现上述窗口才能使用此命令参考链接:1、/s/blog_70b3b3a701015e98.html(此文忘记加模块定义文件mydll.def,而且在Matlab读取路径是的指令也是错误的,参考本文的指令就能跑通)2、/g710710/article/details/7255744(此链接的文章是VS生成dll的方法,但如果想用Matlab调用生成的dll在编写头文件时一定要用上文的编写指令,而不这篇链接里的指令,因为链接里的指令是生成C++的指令,而Matlab只识别C的写法)。
vs2010调用matlab2014a的dll详细步骤(一)——详述matlab的dll生成
vs2010调⽤matlab2014a的dll详细步骤(⼀)——详述matlab的dll⽣成做⼯程这么多年了,总是索取,没有奉献,这样确实不是我的处世态度,这是我的第⼀篇技术贴,以后在⼯作中如果有好的经验⼀定会记录下来,供⼤家分享,共同进步。
先说我的⼯程环境,win7 64位机,装了matlab2014a和vs2010,⽹上有很多讲vs调⽤matlab的帖⼦,能够成功的完成vs 的调⽤也多亏了这些帖⼦,然⽽没有⼀篇完整的帖⼦讲述整个过程,所以我就把⾃⼰从头到尾的步骤,⾃⼰的困惑和解决⽅法都列出来,供⼤家相互学习。
⾸先,matlab⽣成dll。
我装的是盗版matlab2014a,单位只有⼀个正版的matlab⼀直没⽤,我觉得盗版的舒服,感觉像偷偷占了便宜,例⼦中使⽤的是简单的两数和,⽣成matlab⼦函数。
2014a是个坑,它本⾝编译系统有问题,所以需要⽤该⽹址下载⽂件,/smilebluesky/article/details/42987985,替换原有⽂件。
就会解决刚开始的编译问题。
接下来上图,说明整个编译过程步骤。
1、matlab命令⾏输⼊deploytool2、选择第⼆个“Library Compiler”3、添加⽂件,选择“C++ Shared Library”,点击“+”选择编译的⼦函数⽂件“myAdd.m”4、添加完成后,点击对号“Package”5、编译完成,⽣成dll会弹出⽂件夹6、在⽂件“for_redistribution_files_only”中存在我们需要库⽂件完了。
有⼀点需要说明,当时困惑了我。
现在在例程中我们使⽤的是简单的matlab程序,他没有调⽤matlab的函数和⾃⼰编写的函数,如果有函数调⽤了应该怎么写,需要对所有的⼦函数也进⾏编译码?后来问了度娘,⾃⼰也试了,结论如下:分两种情况,1、调⽤⾃⼰编写的⼦函数,这样编译时需要将所有的函数放在同⼀个⽂件夹下,这样编译时会⾃动将被调⽤的⼦函数,放在库中,在vs调⽤时没有问题;2、调⽤了matlab⾃带的函数,这种⽆所谓,直接编译就可以了,matlab会⾃动按照环境变量的设置去寻找库⾥的⼦函数,但有⼀个特例就是神经⽹络,它是不能被编译的,⼈家matlab公司说了,神经⽹络的算法是不对外公开的,所以不能使⽤,这种情况⼤家就在⽹上找神经⽹络的c语⾔代码吧。
Matlab--Matlab生成dll、库文件和头文件方法(win10+VS2015+Ma。。。
Matlab--Matlab⽣成dll、库⽂件和头⽂件⽅法(win10+VS2015+Ma。
MATLAB具有很⾼的计算性能,在该平台上很多算法易于实现,⽽有时需要使⽤C++调⽤Matlab编写的程序,可以将该函数编译成dll库⽂件,之后在C++中对其进⾏调⽤。
本⽂详细讲解在Matlab中将函数编译成库⽂件,并在C++中进⾏调⽤的⽅法。
Matlab编译⾸先,matlab中写好函数第⼀步:在matlab的命令⾏窗⼝中输⼊mex -setup,会出现以下界⾯。
第⼆步:点击界⾯的“mex -setup C++”,会出现如下提⽰。
以上两步说明Matlab的编译环境可⾏,并且是使⽤VS2015进⾏编译。
不同版本的matlab使⽤的编译器可能不同,请确保matlab配置的编译器与之后使⽤的C++环境保持⼀致。
第三步:对matlab的函数进⾏编译。
注意:这⾥只能对matlab的function进⾏编译,并不能对⼀般的.m脚本进⾏编译。
我们采⽤mcc的⽅式进⾏编译,命令如下:mcc -W cpplib:testmat -T link:lib testmat.m -C解释:-W是控制编译之后的封装格式;cpplib是指编译成C++的lib,如果需要编译成C的lib,就⽤lib即可,去掉cpp;cpplib后⾯的是需要⽣成⽂件的⽂件名,是⾃⼰取的,我们取名为testmat;-T表⽰⽬标,link:lib表⽰要连接到⼀个库⽂件的⽬标,⽬标的名字即是.m函数的名字。
其他具体含义可以通过mcc –help命令查看,注意参数的⼤⼩写。
第五步:等待matlab进⾏编译,这个过程可能需要⼏分钟。
编译完成后的命令⾏显⽰如下信息:需要⽤到的⽂件只有四个:testmat.ctf,testmat.dll,testmat.lib,testmat.h。
PS:使⽤上述⽅法时,我第⼀次成功了,后边同样的操作⼀直失败,报错如下图:查了很久也没有找到原因,在Matlab Answers⾥看到⼀个问答,有个回答如下:⼤概意思就是把主编译⽂件.m放在matlab主程序⽂件夹内(我试了不⾏..),或者使⽤deploytool,这个⼯具可以⽣成特定⽂件夹内.m⽂件dll等库的功能。
VC2010在win764位系统下调用MATLAB2012a(2010a以后)的设置方法
VS2010与Matlab2012a混合编程(Alex-liu版,哈哈)套用今天的签名“最新的VS+最新的MATLAB+最新的WINDOWS=无尽的烦恼”,用了一天的时间去配置相关的环境,确实很囧。
好在现在问题解决了,特发布过程如下,希望能给有需要的朋友带来帮助。
注:因为程序也是刚调通,所以有些原因还没有仔细分析,如果不对,敬请指教。
1.<MATLAB>表示MATLAB按照目录2. 配置过程中的错误,请见:附录3.文中包含"只针对64位WINDOWS"字眼设置的,在WIN32(X86)环境无需设置4.本文配置中可能包含多余的一些配置,不过现在的目的是运行成功哈~~~至于精简部分,待我和大家使用时慢慢研究。
/*******************************************环境:1.VS20102.MATLAB2012a3.WINDOW 7 (X64)******************************************/1.Matlab环境设置要建立独立运行的C应用程序,系统中需要安装Matlab、Matlab编译器、C/C++编译器以及Matlab C/C++数学库函数和图形库函数。
Matlab编译器使用mbuild命令可以直接将C/C++源代码编译为独立运行程序,在这些源代码中可以使用Matlab提供的接口来调用Matlab数学库函数。
虽然生成的可执行程序可以脱离Matlab环境运行,但是它需要Matlab C/C++数学库文件或者图形库文件的支持才能运行。
但如果C/C++源代码完全是按传统C/C++源代码语法规则编写,没有包含Matlab数学库和图形库的调用,则不仅可以独立与Matlab环境,也不需要那两个库函数的支持。
在Matlab的Command Window 下输入命令mbuild –setup操作过程如下图:然后输入命令mex –setup以类似的方法配置编译器。
将matlab函数编译成dll供Cpp调用
作者曾经实现过将matlab函数编译成dll供Cpp调用,这篇文章的目的是对新增的面向对象的的扩展mwArray进行讲解,matlab很容易和C/C++联合起来使用。
以前做过matlab7与c++的混合编程:将matlab函数编译成dll给C++调用,从而加快开发的进度。
但是今天在matlab2008b下面又做了一遍,发现matlab又改了很多东西,诸如增加了面向对象的的扩展mwArray,于是做笔记如下。
(一)总体概念matlab提供了丰富的程序接口,除了matlab最初的版本是用fortran写的之外,后来的版本都是用C写的,因此matlab很容易和C/C++联合起来使用。
matlab有着丰富的库函数,将这些库函数直接编译成dll(windows下是dll,linux下是类似于dll的另外一个东西),给C调用,可以加快工程进度。
步骤如下:1. 设置matlab的编译器,使用外部的VC或者gcc等编译器。
2. 编译m文件成dll3. 设置VC等的继承环境,设置C需要用到的静态库和动态库4. 编写C调用dll下面以一个很简单的加法函数为例,说明在VC6和matlab2008b下,怎么做混合编程(二)设置matlab编译器过程如下:1. 在matlab的command window里面敲入mex –setup,matlab会列出所有电脑上所有的编译器。
2. 选择编译器,这里选择2,即VC63.完成之后,敲入mbuild –setup,选择build工具,matlab会列出所有的build工具,同样选择VC6(三)编译m文件首先,写出matlab函数,一个很简单的加法函数,如下:function [c] = MyAdd(a, b);c = a + b;保存为MyAdd.m然后,进行编译,命令如下:mcc -W cpplib:libMyAdd -T link:lib MyAdd其中,mcc是matlab提供的编译命令(可以理解为gcc),对于这一点,matlab的帮助说明如下:-W lib:string link:lib其中-W是控制编译之后的封装格式,cpplib,是指编译成C++的lib,cpplib冒号后面是指编译的库的名字,-T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字是后面的MyAdd,即你写的m函数的名字。
MATLAB与VB混合编程方式简易教程
3.1 MATLAB与Visual Basic语言的混合编程方式MATLAB提供了与C/C++、Fortran语言的接口,但没有与Vsiual Basic语言的接口,要想实现MATLAB与Visual Basic的混合编程可以通过以下途径来实现。
1.通过ActiveX方式一是用Visual Basic开发服务器ActiveX组件,MATLAB作为客户端程序使用,事实上无论是用VB还是VC或者其他语言环境开发的ActiveX组件,对于MATLAB来说集成与调用方式是一样的,一般情况下很容易地将不同环境下开发的用途各异的ActiveX对象集成到一个MATLAB应用中来。
其使用方法见第5章关于MATLAB作为ActiveX的客户端使用方法。
二是在VB环境下可以通过ActiveX自动化接口将MATLAB作为Visual Basic语言的一个ActiveX 部件调用。
MATLAB ActiveX自动化服务的功能主要包括在MA TLAB工作空间执行MA TLAB 命令,以及直接从工作空间存取矩阵等,我们在第5章中关于MA TLAB作为服务器组件的部分的例子就是以Visual Basic应用程序,以MATLAB作为服务器客户端的。
2.通过动态链接库方式该种方式是一种间接调用MATLAB命令的方式,借助于C++与MA TLAB的接口,将MATLAB 的程序文件(.M文件)编译为动态链接库(.DLL),VB在代码中与调用其他语言编写的DLL文件一样调用MATLAB中.M 文件生成的动态链接库。
这种方法可以脱离具体的MA TLAB环境,运行效率较高。
3.通过嵌入VB的矩阵函数库MatrixVB的方法MatrixVB是由第三方(mathtools公司)提供的COM组件,包含了大量与MATLAB相似的函数与调用语法,可以加强VB内建数学运算与图形展示功能,在VB程序代码中可以像使用VB自己的函数一样使用MatrixVB的函数,而且可以不依赖于MATLAB的环境在Visual Basic中完成矩阵运算与图形绘制显示等功能,这种方法使用起来简单,编程效率较高。
VS 2010调用matlab 2010
再次编译,运行程序如下:
手把手教你学 VS 2010 调用 MATLAB 函数
点击“plot”按钮,就绘制出一个正弦曲线。
好了,先讲到这里吧。没来的急检查,先发出来吧!要是还有疑问,请加我的 QQ 群吧: 128229028。记住啊:Work time, no disturbance. 祝大家在学习编程的里程中一帆风顺!
点击“环境变量”按钮,出现下页的对话框。点击系统变量下得新建按钮,弹出“编辑系统变 量对话框” , 假设 VS 装在 D 盘, 变量名随便取一个, 变量值设置为 “D:\Program Files\Microsoft Visual
手把手教你学 VS 2010 调用 MATLAB 函数
Studio 10.0\VC\bin” (以实际的编译器位置为准哦! ) 。完成后点击确定。
4. 动态库调用示例 新建一个工程,工程名:test,建立一个基于对话框的程序。对话框上加一个按钮,取名“plot” 。 在 testmtDlg.cpp 文件中加入如下标灰色背景的代码。
#include "stdafx.h" #include "testmt.h" #include "testmtDlg.h" #include "afxdialogex.h" #include "test.h" //#pragma comment(lib,"libmx.lib") //#pragma comment(lib,"libmat.lib") //#pragma comment(lib,"libeng.lib") #pragma comment(lib,"mclmcrrt.lib") #pragma comment(lib,"test.lib") ……………….. BOOL CtestmtDlg::OnInitDialog() {
vs2010生成dll文件并引用dll
vs2010生成Dll文件并引用dll(C#)(2011-12-26 11:19:12)转载▼标签:分类:编程vs2010cdll引用杂谈1、创建新C#控制台应用程序,项目命名createBll,打开Program.cs重命名为TestA(可以不重命名)并修改代码,如图:写好后,可以写其它的类.cs文件2、完成后,点击菜单栏的“项目”,下拉单选择“createDll属性”,打开如图窗口在输出类型选择“类库”,然后关掉该窗口,生成解决方案,即生成了creatBll.dll文件,在项目下createBll\createBll\bin\Debug\createBll.dll目录下。
3、引用Dll文件,新建项目referenceDll,把上面生成的createBll.dll文件复制粘贴到新项目下Debug文件夹下面4、在referenceDll项目解决方案处的引用点击右键,弹出窗口浏览标签下,打开referenceDll项目下Debug文件,找到刚才复制过来的createBll.dll文件,单击确定即可引用。
5、双击引用下的createBll打开对象浏览器,展开可以看的createBll.dll文件里封装的方法TestA6、编写Program里的相应代码下面是赠送的励志的100句经典话,需要的朋友可以学习下,不需要的朋友可以下载后编辑删除!!谢谢!!【励志的话】平凡却无私的人啊千万不要抱怨命运的不公。
也许,命运只是用另一种方式偏爱着你那是因为善良的她想让你尽快长大感知人间悲喜,聆听世间哀乐。
虽然有时跌倒,有时失败但请记住跌倒不是失败,失败不是否定。
平凡却无私的人啊千万不要抱怨命运的不公也许,命运只是用透明的方式倾向与你那是因为,慈爱的她想让你尽早成熟看尽人间繁华,尝便世间甘苦。
虽然有时哭泣,有时逃避但请记住哭泣不是永久逃避不是永恒平凡却无私的人啊千万不要抱怨命运的不公也许,命运只是施舍于被它偏爱的人那是因为严厉的她不想让你溺爱长大,感受人们欢呼,享受世界鼓舞虽然有时悲愤,有时无助。
VS2010调用matlab引擎找不到dll问题
1.VS2008调用matlab引擎找不到dll问题2. 使用engOpen()打开Matlab引擎失败,注册MATLAB组件VS2008调用matlab引擎找不到dll问题最近尝试在Win7系统下,用VS2008调用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)只需设置一次,因为是对VS2008整体工作环境的设置。
3) 右击工程/属性,打开项目属性页,选择链接器/输入,在附加依赖项编辑框中,添加文件名libmx.lib libmat.lib libeng.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子文件夹中。
程序中使用MATLAB编译产生的DLL(VC6.0,MATLABR2010b,mw...
程序中使用MATLAB编译产生的DLL(VC6.0,MATLABR2010b,mw...最近需要在VC下调用MATLAB的dll,以前没怎么接触过这些,今天特地摸索了一下。
主要借鉴的是taohe兄的这篇帖子:但不同的是我现在用的MATLAB是R2010b,而VC是6.0,两个产品时间间隔达10多年之久。
taohe兄的实验环境是vs2005,MATLAB 2007b两个产品时间间隔还是比较接近的。
之前按照taohe兄帖子里的步骤实现,发现总是无法成功,出现N多各种奇怪错误,譬如:error C2065: 'mclInitializeApplication_proxy' : undeclared identifier 之类的奇怪错误提示(后来才知道这是2008a以后,Mathworks公司对mclmcrrt.h 和mclmcr.h头文件做了修改,要求mclmcr.h必须include在mclmcrrt.h之后。
)现将操作步骤写下:1、编写测试m函数,这个不变,即如下:1.function [y,z] = myadd2(a, b)2.% dummy function, just to demonstrate the idea3.y = a+b;4.z = a+2*b;5.end复制代码2、运行mbuild -setup设置好编译器后(我选的是vc6.0的编译器,没用MATLAB自带的),利用1.mcc -W cpplib:libmyadd2 -T link:lib myadd2.m -C复制代码生成需要的libmyadd2.dll,libmyadd2.h,libmyadd2.lib,libmyadd2.ctf文件。
(注意,R2010b下,mcc -W cpplib:libmyadd2 -T link:lib myadd2.m不再生成libmyadd2.ctf文件,需加-C选项)3、VC下新建控制台程序,步骤如下:file>new,选择Win32 Console Application,右侧project name 填写1.testmyadd2_r2010b复制代码,点击OK。
matlab生成dll方法
b) 在 VC 中用 MFC Wizard(exe)创建一个基于对话框名为 Example 的工程。 在面板上添加一个 ID 为 IDC_BUTTON1 按扭。
c) 将 C:\matcom45\Debug 目 录 下 的 Test1.cpp 文 件 的 内 容 拷 贝 到
void CExamleDlg::OnButton1() 下 ;
2 使用 Matcom 工具
2.1 MATcom 简介
MATcom 是 MATHworks 公司推出的第一个由 MATLAB 到 C++的编译开发
软件平台,其最新版本为 4.5,集成调试编译环境为 MIDEVA。 这个软件可厉害了,他生成的 exe 可执行文件可以在没有安装 MATLAB 的 地方运行,只是需要几个 dll 文件而已。如果用 MATLAB 的 Deployment Tool 来生成的 exe 可执行文件, 在没有安装 MATLAB 的机子上运行时需要安装 MCR, 而 MCR 现在有 200M 多,所以很不方便。 通过 MATcom 连接 MATLAB m 文件 有以下三种方法: (1)经过简单的设置,由 MIDEVA 将 m 源文件转换为 C/C++,然后添加 到 VC 工程中。 (2)由 MIDEVA 直接生成 EXE 文件,然后在 VC 中通过 Shell 调用。这种 方法简单方便,但运行时出现一个控制台窗口,而且由于 VC 和 MATLAB 之间 不能交互,通用性差,仅适用于 VC 调用 MATLAB 实现图形显示的场合。 (3)通过 Visual MATcom 工具条, 使用 Add-in, 这种方法提供了 MATLAB 和 VC 直接集成的途径,且可快速集成 m 文件到 VC 工程中创建独立的 C/C++ 应用程序、C MEX DLL,在调试过程中可以查看矩阵变量的值,可直接修改 m 源文件而不是修改生成的 C/C++文件。
VS2010调用Matlab的m文件所生产的dll实现二次规划算法
VS2010调用Matlab的m文件所生产的dll实现二次规划算法引言二次规划算法可在SQP算法中成为通用的二次规划子问题程序。
二次规划算法设计到众多的矩阵运算,用C++代码编程需要较大工作量,而矩阵运算在Matlab下则相当方便。
但SQP多用于非线性系统的优化,如航空发动机的优化,航空发动机模型通常在C代码下更为方便。
所以本文采用的策略是在Matlab下编写实现二次规划算法的m文件,使用Matlab 编译器将m文件编译成dll动态链接库,然后在VS下调用dll来实现二次规划算法。
1系统环境说明操作系统:Window8 X64.Matlab版本:Matlab2012b(Matlab 8.0).VS版本:VS 2010.添加系统环境变量:Path变量中增加:C:\Program Files\MATLAB\R2012b\bin\win64;重启电脑。
2 二次规划算法的Matlab实现2.1 编程准备工作首先为本文建立一个单独的文件夹\QPTEST,再在该文件夹下建立子文件夹\QPMAT。
然后启动Matlab并将工作目录指定到\QPMAT下。
2.2 m文件编程新建m文件并保存文件名为qpsubp.m,编辑内容如下,代码分析参考文献[1]程序12.1:2.3 m文件测试使用2.2中的程序求解如下二次规划问题:min f(x)=x12+x1x2+2x22−6x1−2x2−12x3s.t. x1+x2+x3−2=0,x1−2x2+3≥0,x1,x2,x3≥0.该问题的极小值点为x∗=(0,0,2)T。
在Matlab命令窗口中输入如下命令:dfk=[-6 -2 -12]’;Bk=[2 1 0;1 4 0;0 0 0];Ae=[1 1 1];hk=[-2]’;Ai=[1 -2 0;1 0 0;0 1 0;0 0 1];gk=[3 0 0 0]’;[d,mu,lam]=qpsubp(dfk,Bk,Ae,hk,Ai,gk)输出结果如下:d =-0.0000-0.00002.0000mu =-12.0000lam =-0.00006.000010.0000-0.00002.4 m文件编译在Matlab命令行中输入编译命令:mcc -B cpplib:qpsubp qpsubp.m。
matlab程序转换和在excel VBA
matlab程序转换和在excel VBA中的调用。
金融行业中VBA有着几乎最广泛的运用,但是很多人苦于VBA很难找到如同matlab强大的数学运算工具库,而在某些问题的处理上会大费周章。
首先打开matlab(我的版本matlab 2006b, version7.3),在命令窗口输入指令:mbuild -setup出现选择:Please choose your compiler for building standalone MATLAB applications:??Would you like mbuild to locate installed compilers [y]/n?接着选择No然后出现选择项:Select a compiler:[1] Borland C++Builder version 6.0[2] Borland C++Builder version 5.0[3] Borland C/C++ (free command line tools) version 5.5[4] Lcc C version 2.4.1[5] Microsoft Visual C/C++ version 8.0[6] Microsoft Visual C/C++ version 7.1[7] Microsoft Visual C/C++ version 6.0??[0] None我们是要转换为excel可以调用的compiler,所以5,6,7都可。
我自己的电脑装有VC++6.0,所以我选择的7接下来就是让你输入你安装的vc++6.0的路径并确认。
??做好这一步之后,就可以在命令窗口输入指令:deploytool然后matlab右边会弹出一个操作窗口,然后新建一个项目和路径,记得选择成builder for excel。
然后在项目里面添加你要转换的所有你自己编写的matlab函数。
(必须是matlab的函数,所以必须以function开头)然后点击"build the project"的小图标,等着转换完成。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MATLAB2014a生成C++代码,并用VC2010生成dll 供VBA或VB调用使用说明一、过程概述1、使用VC2010生成.dll文件,测试VC程序是否正常2、使用VBA调用VC2010生成的.dll文件,测试.dll文件调用的VBA代码是否正常,这里使用Excel VBA主要是为了以后输入输出数据更方便。
3、使用MATLAB编写脚本程序文件,使用MATLAB CODER功能编译成c++文件。
4、VC2010集成MATLAB生成的c++代码,并编译成.dll文件5、使用步骤1,2验证MATLAB生成的代码二、具体实施过程描述1、使用VC2010生成.dll文件1.1工程建立首先打开VS 2010--> 新建工程 --> Win32 --> Win32项目 --> 输入工程名称(MakeDll),选择好保存工程的路径-->确定。
在弹出的“应用程序设置”--> "应用成程序型" --> 选择 "DLL(D)" --> 附加选项-> 选择"空项目(E)" ---->点击"完成"进入项目工作窗口1.2开始创建DLL第一步:在头"解决方案资源管理器" --> 头文件 --> 右键 -->添加新建项---→选择"头文件(.h)" -->输入文件名称(max) --> 点击“添加(A)”,完成max.h文件的添加。
max.h头文件中的代码为:1. #ifndef _MAX_H2. #define _MAX_H_3. __declspec(dllexport) int __stdcall fmax(int a,int b);4. #endif代码说明:__declspec(dllexport) 的作用是指定导出该函数为DLL函数;__stdcall是函数调用约定,表示该DLL函数被C/C++以外的语言调用;备注:使用时需要根据实际定义的主函数返回值类型和函数名称修改低3行红色而自体标记部分内容。
这里需要修改的是int数据类型,fmax(int a,int b)的函数名称和变量名称和变量的类型,或者直接从第二步的主程序中复制过来。
第二步:在头"解决方案资源管理器" --> 源文件 --> 右键 -->添加新建项-->选择"C++文件(.cpp)" -->输入文件名称(max) --> 添加(A)max.c源文件中的代码为:1. #include"max.h"2. int __stdcall fmax(int a,int b)3. {4. return a>b?a:b;5. }主函数中定义了比较两数大小的函数fmax(),依然在此函数前声明该函数的调用为__stdcall类型(被C语言以外的语言调用);备注:第2行中除了 __stdcall不能修改之外,其他的数据类型,变量名称,函数名称均可以根据实际需要进行修改。
例如如下所示的示例。
主程序修改示例int __stdcall fmax(int a,int b){int c;c=a+b;return c; // 返回运算结果}第三步:在头"解决方案资源管理器" --> 源文件 --> 右键 -->添加新建项-->选择"模块定义文件(.def)" -->输入文件名称(max) --> 添加(A)max.def的作用是用于导出一个DLL的函数;max.def模块文件中的代码为:1. LIBRARY MakeDll2. EXPORTS3. fmax @1第一行:“LIBRARY”的作用是告诉链接器(linker)如何命名你的DLL,但它只是影响lib连接dll的名称的,而不是影响生成dll的名称;第二行:EXPORTS 语句的作用是引入导出的函数或数据组成的节;第三行:fmax @1指定按序号导;所有程序文件添加完成后如下图所示。
第四步:按 F5启动调试或直接菜单栏 --> 生成 -->生成 MakeDll(U),这如果提示生成成功那么在你保存工程的的路径下的"Debug"文件夹下即可找到生成成功的MakeDll.dll动态链接库文件在VC2010界面的下方,编译器信息中也会有生成的.DLL文件所在的路径信息,这条信息在VBA中引用.dll时可以直接复制过去。
2 用VB或者VBA调用2.1新建VBA用户窗体或者VB工程选择"标准EXE"在对象窗口设计好如下界面,一些标签,三个文本框和一个按钮,如图:输入以下代码1.Private Declare Function fmax Lib _2."D:\ProgramFile\Vc.dllToVba_ZuiDaZhi\MakeDll\Debug\MakeDll.dll" _2.1.(ByVal inta As Integer, ByVal intb As Integer) As Integer3.Private Sub CommandButton1_Click()4. Dim a As Integer, b As Integer5. a = TextBox1.Text6. b = TextBox2.Text7. TextBox3.Text = fmax(a, b) '调用MakeDll.dll8.End Sub第1行,申明函数,'声明DLL过程第2行,申明.dll所在的文件路径,可根据实际情况更改存放地点第2.1行,申明变量,使用ByVal传值方式将变量传送到.dll中第3—8行完成.dll内的fmax函数调用和结果显示。
运行VB或VBA程序,输入a,b的数值(因为.dll中定义的白能量为int整数型,因此程序在这里使用整数型运算,输入数据的小数点会被自动取整)3、建立MATLAB脚本并编译成c++程序3.1新建脚本程序在增加MATLAB算法程序之前,先完成以上部分的内容,这样为后续增加代码提供良好的基础保障。
1、新建脚本文件,输入如下程序代码function c=foo(a,b)%#codegen%程序算法部分,求和c=a*b^3;end将脚本并保存为foo,这个名称和函数名称要一致这里的“%#codegen”的作用是提示MATLAB这是要生成程序的代码,可以避免一些错误路提示“%程序算法部分,求和”使用%开头,时程序注释部分,这部分生成代码时不会编译,因此可以在这里详细地描述程序的功能,输入输出变量等,代码生成后在foo.cpp中也可以看到这些注释的内容。
3.2新建一个程序生成的工程3.2.1如下图所示,新建代码生成工程,输入工程名称foo3.2.2代码生成的文件输入和变量的格式选择点击右下角的“添加文件”→选择foo.m文件,设置变量a,b的格式,这里a,b都是单个的变量,因此选择为double型,格式1x1矩阵--只有一个元素的矩阵。
3.2.3代码生成方式设置输入生成的程序名称,程序类型,还要在设置界面设定语言为c++,然后点击“编译”按钮即可完成程序代码的生成。
完成后可以直接查看报告,算法的核心部分位于foo.cpp文件下。
代码生成报告内容如果提示找不到编译器,在命令窗口输入mex –setup选择已经安装的编译器后重新编译即可。
4、VC2010集成MATLAB生成的代码4.1添加生成代码的头文件和源文件在这里和上文不一样的地方是,上文中max.cpp,max.def,max.h在这里前部改成了VcFunction.cpp, VcFunction.def,VcFunction.h,而上文的函数名称fmax改成了foo。
首先在头文件和源文件文件夹下添加代码生成报告中的所有的头文件和源文件,这些文件在代码生成文件夹下面添加代码生成所在文件夹的路径,项目标题上右键→属性在包含目录栏中更改为代码生成的目录下的文件夹生成的代码在foo文件夹下,那么路径就制定到foo文件夹的位置。
4.2VC2010中调用MATLAB功能函数(红色部分,直接调用即可VcFunction.cpp)//主程序部分//申明程序是由C语言以外的的程序调用#include"foo.h"#include"VcFuntion.h"double __stdcall VcFuntion(double a,double b){double c;c=foo(a,b); //这里foo是MATLAB程序中定义的函数名称,不要和VC中的名称混淆return c; //返回运算结果}在foo.cpp程序中找到主程序,找到出现MATLAB脚本程序中的注释的位置即可,如下所示// 求和---------------------------------MATLAB中的注释部分内容// Arguments : double a// double b// Return Type : double//double foo(double a, double b){这里可以看到,VC中的主程序VcFunction.cpp的写法和foo.cpp中主程序的写法十分类似,结构一样。
double __stdcall VcFuntion(double a,double b)只是中间增加了__stdcall,函数名称改为VC中的名称VcFuntion VcFunction.h程序部分的写法和上文说的一样,根据这里的主函数内容更改了数据类型和函数名称而已。
__declspec(dllexport) double__stdcall VcFuntion(double a,double b);5、同步更新的使用生成dll文件并按上面的方式在VBA中调用,同时打开MATLAB,VC2010的时候,更改MATLAB脚本文件的内容,编译后,VC2010会提示是否更新程序,选择更新程序即可实现程序的同步更改。
编译后.dll文件也更新了。
但是不能在VB或VBA正在调用.dll时进行以上操作,因为此时VB或VBA程序正在运行,dll 正在被使用,不能打断程序运行。
6、固定长度数组变量输入的程序如果输入的变量为数据和矩阵,并且变量的长度和矩阵的大小固定不变,可以使用这种方式生成代码。
例如:function Zi=foo(X,Y,Z,Xi,Yi)%#codegen%计算算法Zi=interp2(X,Y,Z,Xi,Yi);End这个程序的功能是,输入已知的X(1×4),Y(1×4)向量和Z(4×4)矩阵,使用三元两点法实现插值计算的到Xi,Yi对应的点Zi6.1 MATLAB代码生成设置只需要更改变量维数部分的定义,入下图所示6.2 VC集成MATLAB生成的代码首先找到foo.cpp程序中由MATLAB脚本程序生成的代码部分的内容。