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 打包组件选项。

  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的写法)。

相关文档
最新文档