Matlab调用VC生成的dll的具体步骤

合集下载

MATLAB2014aC++代码生成,并用VC2010生成dll供VBA或VB调用使用说明

MATLAB2014aC++代码生成,并用VC2010生成dll供VBA或VB调用使用说明

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行红色而自体标记部分内容。

LabwindowsCVI调用外部DLL文件的问题

LabwindowsCVI调用外部DLL文件的问题
panelHandle = 0;
}
}
这样的目的是:在外部调用的时候,便于调用。
C源文件编写完整后,把相关的*.uir文件添加到工程中,然后编写一个*.h文件,命名为exampledll.h,里面包含一个源文件中的函数申明。定义如下:
externint InitUIForDLL (void);//调用面板的函数
InitUIForDLL ();
return 0;
}
(2)通过一个按键来调用dll,即在一个工程中通过一个按钮来调取dll中的函数,来完成此按扭的功能。
与用c源代码来调用的方式一样,只是此工程已经有*.uir对象面板,在*.uir的面板上添加一个按钮,为按钮生成一个函数,在函数中调用外部dll中的函数。在编译前,要将*.lib和*.dll文件和头文件包含在工程中,并且将dll中的函数用一个*.h头文件包含:
int __stdcall DllEntryPoint (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
这两个函数是DLL动态链接库必须包含的两个函数,函数的具体内容为:
#include <cvirte.h>
int __stdcall DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
#include "CFI.h"
static int panelHandle;
int main (int argc, char *argv[])
{
if (InitCVIRTE (0, argv, 0) == 0)
return -1;/* out of memory */

在VS2010中调用MATLAB生成的DLL

在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 分享

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,同时将可执行文件的图标放在桌面。

VC++调用Matlab引擎(engine)配置方法

VC++调用Matlab引擎(engine)配置方法

如何在C/C++语言里调用Matlab引擎(engine)——(上篇)windows下的Visual C++平台Windows下调用Matlab引擎要做好以下三点设置(1)设置头文件目录(2)设置库文件目录,并添加链接库输入项libeng.lib和libmx.lib(3)设置环境变量以下以Visual Studio 2008为例来说明如何设置这三点:1、添加头文件目录依次选择:“工具”->“选项”,调出对话框后再在对话框左边“选择项目和解决方案”->“VC++目录”然后在右边选择“显示以下内容的目录”下的选框选择“包含文件”,再在目录列表的最下边空行处选中添加:matlab安装目录下的\extern\include路径比如我的是:C:\Program Files\MATLAB\R2011a\extern\include如果现在生成项目,链接将不会通过,比如可能会出现:1>engwindemo.obj : error LNK2019: 无法解析的外部符号_mxDestroyArray,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_mxGetPi,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engClose,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engGetVariable,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engOutputBuffer,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engEvalString,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engPutVariable,该符号在函数_WinMain@16 中被引用等链接错误;这就需要设置下面的库文件目录2、添加库文件目录在刚才调出来的对话框中,设置库目录:选择“显示以下内容的目录”下的选框选择“库文件”添加matlab目录下的C:\Program Files\MATLAB\R2011a\extern\lib\win32\microsoft注意:如果是项目要生成的是64位程序那么应该选择的是C:\Program Files\MATLAB\R2011a\extern\lib\win64\microsoft点击确定退出对话框,然后给项目添加链接库输入项:在解决方案资源管理器里选择对应的项目单机右键选择最下面的“属性”弹出属性对话框,在右边依次选择“配置属性”->“链接器”->“输入”,然后在右边“附加依赖项”那一项加上libeng.lib libmx.liblibmat.lib单击确定退出注意:(1)不要删除原有的依赖项(2)依赖项之间用空格隔开做到这一步时生成时就没问题出现了,但是运行程序时会出现“因为计算机中丢失libeng.dll”等类似问题第(3)步就解决这个问题的。

MATLAB调用C++DLL

MATLAB调用C++DLL

MATLAB调用C++动态库的方法声明:本人知识水平有限,文档中难免有错,望谅解!一、方法步骤1、首先确定你的动态库正确,并将你的动态库(例如:Demo.dll)和静态链接库(Demo.lib)和自定义的相关头文件(例如:Demo.h等)拷贝到当前工作目录下,当然也可以将你的动态库拷贝到C盘的windows\system32目录下。

2、写.cpp文件,并用mex命令生成.mexw64或者.mexw32文件(这由你的系统决定),其实,这个文件起转换作用。

也就是说,你用MATLAB调用C++动态库就必须通过这个文件去调用,而这个文件就是由.cpp文件生成的。

这个.cpp文件中必须包含这个mexFunction函数,格式也必须如下:void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])nlhs:输出参数个数plhs:输出参数列表nrhs:输入参数个数prhs:输入参数列表不过函数名可以随便取的。

在这个函数中你就可以去调用C++动态库的函数了。

记住头文件:”mex.h”……注意:保存的文件名就是将来在MATLAB中调用的函数名,而不是这里的函数名。

3、使用mex命令编译XXX.cpp。

如:mex xxx.cpp ;那么系统将生成xxx.mexw32或者xxx.mexw64文件。

这个文件的文件名就将是你要调用的函数名;4、现在就可以写脚本调用这个函数了。

二、案例1、现在生成了一个C++动态库Demo.dll\Demo.lib,还有头文件Demo.h;里面定义了一个函数double Demo_Add( double x, double y); //功能:将两个数相加并返回这些大家都知道,不用我说了吧。

2、在MATLAB中写一个c++文件Test.cpp:#include "mex.h"#include "Demo.h"#pragma comment(lib,"Demo.lib")void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]){if( nrhs != 2) //判断输入参数的个数{mexErrMsgTxt("输入参数个数不对!");}//得到传入的第一个参数,并转换了double类型double p1 = *((double*)mxGetPr(prhs[0]));//得到传入的第二个参数,并转换了double类型double p2 = *((double*)mxGetPr(prhs[1]));//创建一个1*1的实时double类型的矩阵plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);//得到输出的第一个参数的指针double *output = (double*)mxGetPr(plhs[0]);//调用Demo.dll定义的函数实现功能,并将返回值给输出参数*output = DEMO_Add(p1, p2);}3、在当前工作目录下只用mex Test.cpp编译,编译成功将生成MEX文件,Test.mexw32或者Test.mexw64.5、那么现在你就可以通过Test这个函数名去调用Demo_Add函数了.我现在就写一个脚本文件First.m:clcclearticx = 1.6;y = 2.7;Test_add = Test(x, y)toc6、run这个脚本.MATLAB调用C++动态库就成功了….Author : Li JunDate :2012-03-26。

(完整版)matlab和c++调用DLL方法

(完整版)matlab和c++调用DLL方法

(完整版)matlab和c++调用DLL方法Matlab和C++调用DLL方法Matlab可以调用外部DLL,如用C或C++写的DLL。

本文分三个部分介绍Matlab和C++调用DLL方法。

一、C++写dll方法二、C++调用dll三、Matlab调用dll一、C++写DLL方法在CPP文件中和普通CPP没什么区别,在H文件中加上需要导出的函数名,格式如下:extern "C" int __declspec(dllexport)add(int x, int y);蓝色部分是函数返回的类型,红色部分是要导出的函数,就这么简单。

下面是两个整数相加的代码:main.h:extern "C" int __declspec(dllexport)add(int x, int y);main.cpp:#include "main.h"int add(int x, int y){return x + y;}编译即可得到dll文件,我的工程名叫mydll,因此得到的是mydll.dll二、C++调用DLL方法将DLL文件拷入到源文件夹中,在CPP代码中引入windows.h 文件,否则有些方法找不到,用指针来接受参数。

装载DLL,用函数名,卸载DLL。

代码如下:#include#includeusing namespace std;int main(void){typedef double(*padd)(double a,double b);double r;HINSTANCE hDLL;padd add;hDLL=LoadLibrary("mydll.dll");add=(padd)GetProcAddress(hDLL,"add");r=add(5.3,8.6);cout<<r<<endl;< bdsfid="98" p=""></r<<endl;<>FreeLibrary(hDLL);return 0;}三、Matlab调用DLL通常matlab调用DLL有两种方法,一种是用mex文件,另一种是用matlab的函数。

利用matlab进行dll文件生成流程

利用matlab进行dll文件生成流程

dll文件生成流程
1、在Matlab 命令窗口输入命令dotnettool,弹出Matlab Builder窗口
图2 dotnettool的图形界面
2、在File菜单中,点击New Project,弹出New Project Settings窗口,在
Component name内,填入工程名(可任取),然后在Compiler options 内,选择Create a singleton MCR和Show Verbose output两选项。

点击OK,弹出Project Directory 窗口,点击Yes,返回Matlab Builder窗口。

(Project directory必须置于Matlab安装目录的work文件下)
图3 设置相关内容
图4 询问是否创建目录
3、在Matlab Builder窗口,点击M-Files,然后点击Add File,弹出Add File
to Project窗口,选择需要编译的M文件。

图5 选择编译文件界面
4、在Matlab Builder窗口,点击Build菜单中.NET Object,进行编译。

图6 编译过程
5、编译完成后,点击File菜单中Package Component,弹出Package Files窗
口,点击Creat,对当前工程中必要的文件打包。

图7 打包组件选项。

C++调用matlab动态库

C++调用matlab动态库

C++调用matlab动态库环境:Windows 7旗舰版(32位),VS2008,Matlab R2010b1. matlab中dll创建1.1 m文件编写function t = func(file)t=2;end将M文件保存为func.m,保存在d:/test文件夹中。

1.2 设置编译器在Matlab主窗口中将当前文件夹改为d:/test。

为了能够让VC调用Matlab程序,我们可以采用将Matlab程序包装成动态链接文件DLL的形式,然后让VC调用动态链接文件,因此在Matlab中,我们需要设置一下Matlab的编译库,在Matlab主窗口中键入如下代码:mex -setup然后出现Please choose your compiler for building external interface (MEX) files:Would you like mex to locate installed compilers [y]/n?键入y后回车,出现Select a compiler:[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\Matlab\sys\lcc[2] Microsoft Visual C++ 2008 SP1 in D:\Program Files\Microsoft Visual Studio 9.0[0] NoneCompiler:由于我们是需要用VC来调用Matlab函数,因此我们选择2,回车,出现Please verify your choices:Compiler: Microsoft Visual C++ 2008 SP1Location: D:\Program Files\Microsoft Visual Studio 9.0Are these correct [y]/n?键入y后回车,出现*************************************************************** ************Warning: MEX-files generated using Microsoft Visual C++ 2008 requirethat Microsoft Visual Studio 2008 run-time libraries beavailable on the computer they are run on.If you plan to redistribute your MEX-files to other MATLAB users, be sure that they have the run-time libraries.*************************************************************** ************Trying to update options file: C:\Users\Administrator\AppData\Roaming\MathWorks\MATLAB \R2010b\mexopts.bat From template:D:\PROGRA~1\Matlab\bin\win32\mexopts\msvc90opts.bat Done . . .*************************************************************** ***********Warning: The MATLAB C and Fortran API has changed to support MATLABvariables with more than 2^32-1 elements. In the near future you will be required to update your code to utilize the new API. You can find more information about this at:/doc/35346238.html,/support/solutio ns/en/data/1-5C27B9/?solution=1-5C27B9 Building with the -largeArrayDims option enables the new API.*************************************************************** ***********如果出现以上说明,则证明Matlab编译器设置成功了。

VC++中使用MATLAB的C++数学库和MCC生成的程序

VC++中使用MATLAB的C++数学库和MCC生成的程序
另保存为 :mex_vc.h
(2)启动VC,创建MFC AppWizard(dll)程序框架
(3)设置系统选项
a. 设定头文件和库文件路径
菜单Tools->Options->Directories
Include files:添加c:\matlab\extern\include
3、设置编译环境
Tools->Options->Directories
Include fiels添加:
c:\matlab\extern\include
c:\matlab\extern\include\cpp
Library fiels添加:
C:\MATLAB\extern\include>lib /def:matlab.def /out:matlab.lib
Microsoft (R) Library Manager Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserveATLAB下用下面格式的命令生成cpp文件
mcc -t -L Cpp test
得到test.hpp, test.cpp
将test.cpp加入项目, 不做任何改动.
Link->Object/Library modules: 添加matlab.lib
注1. 其它优化、调试以及头文件、库文件等选项看情况调整
注2. Release版在General->Microsoft Foundation Classes选项中,
这里先说明一下:
MATLAB程序test.m:

Labwindows调用外部DLL文件的问题

Labwindows调用外部DLL文件的问题

1. dll文件的编写(1)打开软件Labwindows/CVI,点击File->New->project新建一个工程*.prj,如图所示。

然后保存为example.prj。

(2)用同样的方式,新建一个*.c文件,然后按照下图所示,在Edit->Insert Construct->Dllmain,然后软件会自动在c文件中添加以下两个函数:int __stdcall DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)int __stdcall DllEntryPoint (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)这两个函数是DLL动态链接库必须包含的两个函数,函数的具体内容为:#includeint __stdcall DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){switch (fdwReason){case DLL_PROCESS_ATTACH:if (InitCVIRTE (hinstDLL, 0, 0) == 0)return 0;/* out of memory */break;case DLL_PROCESS_DETACH:CloseCVIRTE ();break;}return 1;}int __stdcall DllEntryPoint (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved){/* Included for compatibility with Borland */return DllMain (hinstDLL, fdwReason, lpvReserved);}然后在上面C源文件中编写相关的函数,然后保存文件为example.c。

c++调用matlab函数

c++调用matlab函数

一、问题描述有关在C++程序中使用MATLAB编译产生的动态链接库DLL,看了好多帖子,感觉描述的不尽详细,调试过程费了好多劲,现在用文字和图片的形式记录一下自己学习的过程。

MATLAB可以把m代码编译成两种DLL,分别是C语言接口和C++语言接口的DLL。

这里以调用C++接口的DLL中的函数为例来介绍。

在C++接口的DLL中,函数的输入、输出参数都是mwArray对象。

所以问题归结为如何在C++程序中使用mwArray。

在这个例子中,输入输出都是矩阵,至于标量,可以作为矩阵的一行或一列传递。

二、实验内容:把一个简单的m代码编译成C++接口的DLL,然后在C++程序中调用。

为了简单起见,这里的C++程序是一个Win32 Console程序,而不是Windows图形界面的程序,不过不妨碍我们的讨论。

三、实现环境:Windows xp 2002 sp3Matlab 2008b 安装路径:D:\Program Files\MATLAB\R2008bVs 2008 sp1 安装路径:D:\Program Files\Microsoft Visual Studio 9.0四、配置matlab生成dll文件:1.在matlab 中选择C++编译器>> mbuild -setupPlease choose your compiler for building standalone MATLAB applications:Would you like mbuild to locate installed compilers [y]/n?nSelect a compiler:[1] Lcc-win32 C 2.4.1[2] Microsoft Visual C++ 6.0[3] Microsoft Visual C++ .NET 2003[4] Microsoft Visual C++ 2005[5] Microsoft Visual C++ 2005 Express Edition[6] Microsoft Visual C++ 2008[0] NoneCompiler: 6The default location for Microsoft Visual C++ 2008 compilers is C:\Program Files\Microsoft Visual Studio 9.0,but that directory does not exist on this machine.Use C:\Program Files\Microsoft Visual Studio 9.0 anyway [y]/n? nPlease enter the location of your compiler: [C:\Program Files\Microsoft Visual Studio 9.0] D:\Program Files\Microsoft Visual Studio 9.0Please verify your choices:Compiler: Microsoft Visual C++ 2008Location: D:\Program Files\Microsoft Visual Studio 9.0Are these correct [y]/n? Y******************************************************************* *********Warning: Applications/components generated using Microsoft Visual Studio2008 require that the Microsoft Visual Studio 2008 run-timelibraries be available on the computer used for deployment.To redistribute your applications/components, be sure that thedeployment machine has these run-time libraries.******************************************************************* *********Trying to update options file: C:\Documents and Settings\Administrator\ApplicationData\MathWorks\MATLAB\R2008b\compopts.batFrom template: D:\PROGRA~1\MATLAB\R2008b\bin\win32\mbuildopts\msvc90compp.batDone . . .>>2.编写m文件编写myadd2.m文件(如下),保存在D:\My Documents\MATLAB目录下;同时把该目录设置为matlab当前目录。

C#调用MATLAB生成的dll

C#调用MATLAB生成的dll

C#调用Matlab生成的dll1.1操作环境操作系统●Win7(32位)必需软件:●Matlab R2015a●Visual Studio2012(包含Visual C#和Visual C++)●Net Framework4.0以上1.2操作步骤首先Matlab的打包工具,把Matlab函数打包为dll文件。

然后在C#中,引用生成的dll 文件,并在程序中调用dll中的函数。

下面分步骤介绍:1.2.1路径设定在F盘新建一个名为Matlab的文件夹;启动Matlab.exe,在命令窗口输入pathtool,会弹出如下对话框。

点击【Add Folder】,选择刚才的文件夹即可。

关闭对话框后,在命令窗口输入userpath(‘F:\Matlab’)。

按回车设定完毕。

1.2.2M文件创建在Matlab中新建一个M文件,写入如下函数代码,保存为F:\Matlab\gougu.m。

function w=gougu(a,b)w=a*a+b*bend1.2.3打包生成dll在Matlab命令窗口输入deploytool,弹出如下选项,选择“Library Compiler”出现打包程序窗口界面:在窗口中进行如下选择:Type:.Net AssemblyExplored Functions:选择刚才做好的gougu.m文件Packaging Options:勾选上面的复选框,取消勾选下面的复选框。

填写Library Information各项最后,点击窗口右上角的Package按钮,一直等待到提示打包完成。

打包结束后,会在文件夹中看到生成了的dll文件,路径为“F:\Matlab\gougu\for_redistribution_files_only\gougu.dll”。

1.2.4C#调用dll在Visual Studio2012中,新建一个C#控制台程序或者WinForm应用程序,本例创建的是窗体应用程序,在默认窗体上放入一个标准按钮button1。

matlab与C混合编程步骤详解

matlab与C混合编程步骤详解

1MATLAB Compiler 是MATLAB自带的一个编译器,它能将m文件转化成 C、C++或p等各种类型的源代码,并根据需要生成可执行文件、lib文件(库文件)、dll文件或S函数文件等。

Matlab所使用的编译器包括了MATLAB 的C\C++数学库函数以及图形库。

必须保证编译器的正确配置,因为编译器使用了C\C++库函数,所以在使用前需要使用mex -setup 和 mbuild -setup两个命令对编译器进行配置。

步骤如下:1. 设置Matlab的编译器,使用外部的VC或者gcc等编译器。

2. 编译m文件成dll3. 设置VC等的继承环境,设置C需要用到的静态库和动态库4. 编写C调用dll1.1设置MATLAB编译器首先要安装Matlab 编译器,一般来说,在安装了Matlab后编译器就己经安装了,所在就只需要对Matlab编译器进行设置。

1.1.1 编译环境设置首先设置系统的环境变量,点击“我的电脑”属性-→系统特性--→高级-→环境变量-→添加系统变量Matlab值为Matlab的安装路径:G:\matlab7.0\bin\win32,重启电脑即可。

1.1.2 MATLAB7.0 编译器设置(a) 为编译后产生的MEX文件进行预配置在Matlab 的命令窗口(Command Window) 键入“mex -setup ”命令后,按回车键,安装Matlab 编译器;(b) 为产生独立外部应用程序进行预配置对Matlab编译器mbuild应用程序进行设置,运行Matlab ,在Matlab 的命令窗口(Command Window) 键入“mbuild -setup ”命令后,按回车键,安装Matlab 编译器;1.2 将MATLAB函数转成DLL函数在Matlab的Command Window /下输入命令:命令 1 :mcc -W lib:dlltest -T link:lib huatu_test.m或命令 2 :mcc -W cpplib: dlltest -T link:lib huatu_test.m命令1生成的是C,命令2生产的是C++。

CC++下调用matlab函数操作说明

CC++下调用matlab函数操作说明

CC++下调⽤matlab函数操作说明1.matlab的安装连接:/s/1qXuF7aO安装32位版本的matlab(在⽬录下bin⽂件夹中有两个⽂件夹,选择win32⽂件夹下的setup进⾏安装)2.matlab mex编译器配置安装完matlab之后,需要设定对应的c++编译器才能编译.m⽂件⽣成可供c++调⽤的库⽂件。

打开matlab,在命令⾏输⼊:mex -setup,选择已安装的vc编译器我的matlab版本是R2010b,选择的是[2] Microsoft Visual C++ 2008 Express,然后⼀直选择y直到看到Done然后继续在命令⾏中输⼊:mbuild -setup ,按照上述类似的⽅式设置编译器假设存在⼀个Add.m的⽂件需要编译成库⽂件,Add.m⽂件function C=Add(A,B)C=A+B;end使⽤命令编译:mcc -W cpplib:libAdd -T link:lib Add.m成功编译会在Add.m的路径下⽣成⼀些⽂件:如果出现错误,可能是编译器配置错误,依次输⼊⼀下两⾏命令查看配置⽂件:>> cd(prefdir)>> edit compopts.batset VSINSTALLDIR= 这⾥如果是空值,需要将电脑中安装的VC路径写到这⾥3.创建c++程序调⽤matlab函数将前⾯⽣成的libAdd.dll"、"libAdd.h"和"libAdd.lib"三个⽂件拷贝到新建的vc⼯程中,并配置⼯程属性,添加matlab安装⽬录下extern中include⽂件夹,我的是D:\matlab\extern\include然后配置库⽬录:添加D:\matlab\extern\lib\win32\microsoft这⾥需要注意的是,该路径下有" mclmcrrt.lib"⽂件,是我们需要的。

VC调用matlab的linprog函数-----自己的总结

VC调用matlab的linprog函数-----自己的总结

VC调用matlab的linprog函数-----自己的总结1.编写m文件function [X,f]=lin(f,A,b)[x,fval] = linprog(f,A,b);X=x;f=fval;End保存为lin.m2.将m文件编译为dllmcc -W cpplib:liblin -T link:lib lin.m -v其中,libname为编译后的库文件名,lin.m为matlab的m文件名该命令用于mwArray数据类型生成四个文件(用到的):liblin.ctf liblin.dll liblin.h liblin.lib3.VC++6.0工程的创建与设置(1)建立一个名为Test的C++控制台工程,在工程中添加一个名为test.cpp文件(2)对VC++6.0的设置(与matlab关联,一旦设置后以后就不需再修改)----工具--->选项---->目录----->include files: 加入--e:\matlab7\extern\inlcude------>Library files:加入--e:\matlab7\exterm\lib\win32\microsoft\msvc60(3)针对该工程的设置:工程---->设置----->连接---->对象/库模块:加入mclmcrrt.libliblin.lib(自己制作dll时生成的库文件)注:也可以不在这里设置,在test.cpp文件中加入:#pragma comment(lib,"mclmcr.lib")#pragma comment(lib,"liblin.lib")(4)将前面生成的四个文件(matlab的works文件夹下)添加到VC6.0建立的工程目录下,将liblin.h添加到工程(工程--->添加到工程---->文件)例: min f = -4x1- x2,s.t. -x1+2x2<=42x1+3x2<=12x1-x2<=3x1,x2>=0(1)在matlab中计算:>> f = [-4;-1];>>A = [-1 2; 2 3; 1 -1];>>b = [4;12;3];>>[x,fval] = linprog(f,A,b)(2)在VC中调用dll具体代码:#include <iostream>using namespace std;#include "mclmcr.h"//mwArray类型定义#include "liblin.h"dll的头文件#pragma comment(lib,"mclmcr.lib")#pragma comment(lib,"liblin.lib")int main(){//初始化程序if(!mclInitializeApplication(NULL,0)){cout<<"Could not initialize the application!";exit(1);}//初始化库if(!liblinInitialize()){cout<<"Could not Initialize the library!";exit(1);}//输入参数f,A,bmwArray A(3,2,mxDOUBLE_CLASS);mwArray f(2,1,mxDOUBLE_CLASS);mwArray b(3,1,mxDOUBLE_CLASS);//输出参数X,fvalmwArray X(2,1,mxDOUBLE_CLASS);mwArray fval(1,1,mxDOUBLE_CLASS);//输入,传给mwArraydouble aa[]={-1,2,1,2,3,-1};//注意,这里的约束系数与在matlab中的不一样double bb[]={4,12,3};double ff[]={-4,-1};//给f,A,b赋值A.SetData(aa,6);b.SetData(bb,3);f.SetData(ff,2);//调用函数lin(2,X,fval,f,A,b);//从X,fval取值double* x;double* fv;x = new double[2];fv = new double[1];X.GetData(x,2);fval.GetData(fv,1);//输出结果cout<<"X = "<<x[0]<<" "<<x[1]<<endl; cout<<"fv = "<<fv[0]<<endl;//关闭库和程序liblinTerminate(); mclTerminateApplication();return 0;}。

C 中调用MATLAB方法

C  中调用MATLAB方法

三种方式在C++中调用matlabC/C++调用Matlab在工程实践中,C/C++调用Matlab的方法主要有调用Matlab计算引擎、包含m文件转换的C/C++文件,以及调用m文件生成的DLL文件。

1利用Matlab计算引擎Matlab的引擎库为用户提供了一些接口函数,利用这些接口函数,用户在自己的程序中以计算引擎方式调用Matlab文件。

该方法采用客户机/服务器的方式,利用Matlab引擎将Matlab和C/C++联系起来。

在实际应用中,C/C++程序为客户机,Matlab作为本地服务器。

C/C++程序向Matlab计算引擎传递命令和数据信息,并从Matlab计算引擎接收数据信息。

Matlab提供了以下几个C语言计算引擎访问函数供用户使用:engOpen,engClose,engGetVariable,engPutVariable,engEvalString,engOutputBuffer,engOpenSingleUse,engGetVisible,engSetVisible。

下面以C语言编写的、调用Matlab引擎计算方程x3?2x+5=0根的源程序example2.c 为例,说明C/C++调用Matlab计算引擎编程的原理和步骤:#include<windows.h>#include<stdlib.h>#include<stdio.h>#include"engine.h"int PASCAL WinMain(HANDLEhInstance,HANDLE hPrevInstance,LPSTR lpszCmdLine,intnCmdShow){Engine*ep;mxArray*P=NULL,*r=NULL;char buffer[301];doublepoly[4]={1,0,-2,5};if(!(ep=engOpen(NULL))){fprintf(stderr,"\nCan'tstart MATLAB engine\n");return EXIT_FAILURE;}P=mxCreateDoubleMatrix(1,4,mxREAL);mxSetClassName(P,"p");memcpy((char*)mxGetPr(P),(char*)poly,4*sizeof(double));engPutVariable(ep,P);engOutputBuffer(ep,buffer,300);engEvalString(ep,"disp(['多项式',poly2str(p,'x'),'的根']),r=roots(p)");MessageBox(NULL,buffer,"example2展示MATLAB引擎的应用",MB_OK);engClose(ep);mxDestroyArray(P);return EXIT_SUCCESS;}在Matlab下运行example2.exe:mex-f example2.c。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Matlab调用C生成的dll的具体步骤一、C生成dll文件(以vs2008为例)
1创建项目: Win32->Win32项目,名称:MyDLL
2新建头文件testdll.h,并编写相关程序
注:一定要注意头文件的写法,此法是支持C的头文件,Matlab调用DLL只支持用C 语法写成的DLL,C++的一些关键特性如类、继承等都不支持,用起来的话局限性很大的,还不如单独再用M文件把算法再写一遍进行仿真呢。

具体程序如下
#ifndef MATLABDLLTEST_H
#define MATLABDLLTEST_H
#ifdef __cplusplus
extern "C"
{
#endif
__declspec(dllexport) double add(double x, double y);
#ifdef __cplusplus
}
#endif
#endif
3新建源文件testdll.cpp,并编写相关程序
具体程序如下所示:
#include "stdafx.h"
#include "testdll.h"
double add(double x, double y)
{
return (x+y);
}
4新建模块定义文件mydll.def,并编写相关程序
二、Matlab调用生成的dll
1、编译器准备
1)在Matlab的命令窗口输入:mex -setup
2)选择你的编译器,我的是:
[2] Microsoft Visual C++ 2008 SP1 in c:\Program Files\Microsoft Visual Studio 9.0
2、加载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的写法)。

相关文档
最新文档