C++和MATLAB混合编程-DLL

  先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件加载入内存。并且DLL在运行时是共享的,即当多个程序调用时,内存中也只保持一份动态链接库。
  动态链接库的调用有显式和隐式两种方式。
  隐式链接需要用到我们前面生成的plotdata.c,plotdata.h,plotdata.lib以及plotdata.dll文件。
  首先将plotdata.c,plotdata.h加入工程中,注意在需要用到函数的文件加入#include "plotdata.h".
  之后链接输入项中写上plotdata.lib.右击工程->Propertites->Link->Input->Additional Dependecies中加上plotdata.lib(也就是在调用MATLAB引擎时填写libmat.lib、libeng.lib等的地方)注意plotdata.lib也需要放在你的工程下,或者写全路径,如"D:\data\plotadata.lib",需要加引号。
  这样在你的代码中就可以直接用plotdata.h中的接口函数了。
  另显式链接的方式:所谓"显式"说白了就是在代码中写出来我要调用这个DLL.
  首先我们需要定义一个函数类型,方便我们后面进行函数的强制类型转换。我们可以在plotdata.h中找到我们将要使用的函数plotdata,他的函数声明如下:
  extern LIB_plotdata_CPP_API void MW_CALL_CONV plotdata(const mwArray& rgbData);
  忽略那些复杂的宏定义,模仿着定义我们自己的函数类型:
  typedef void (*HMAT)(const mwArray& rgbData);
  之后在代码中显式链接plotdata.dll
  HINSTANCE hDLL=NULL;//DLL句柄
  hDLL=LoadLibrary("plotdata.dll");
  HMAT plotData=(HMAT)GetProcAddress(hDLL,"plotdata");
  //第一个参数为DLL句柄,第二个为要加载的函数名
  之后便可直接在代码中直接使用函数plotData了。这种显式链接只需要plotdata.dll文件即可~
  下面我们来看一下生成的函数接口
  extern LIB_plotdata_C_API
  bool MW_CALL_CONV plotdataInitializeWithHandlers(
  mclOutputHandlerFcn error_handler,
  mclOutputHandlerFcn print_handler);
  extern LIB_plotdata_C_API
  bool MW_CALL_CONV plotdataInitialize(void);
  extern LIB_plotdata_C_API
  void MW_CALL_CONV plotdataTerminate(void);
  extern LIB_plotdata_C_API
  void MW_CALL_CONV plotdataPrintStackTrace(void);
  extern LIB_plotdata_C_API
  bool MW_CALL_CONV mlxPlotdata(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);
  extern LIB_plotdata_C_API
  long MW_CALL_CONV plotdataGetMcrID();
  extern LIB_plotdata_C_API bool MW_CALL_CONV mlfPlotdata(mxArray* rgbData);
  这是plotdata.h中主要的函数。plotdataInitialize(void)可以看出是初始化的函数。如果是隐式链接DLL最好先调用此函数,判断返回值否则很可能加载不到dll,而在显式链接时,如果没有加载函数成功,也不会直接报错,但我们可以在单步调试时看函数是否为分配了内存(即是否为null)。plotdataTerminate(void)是终止动态链接库的函数。
  mlxPlotdatat与mlfPlotdata是最关键的两个接口,也是我们要加载的函数。他们执行的功能与m文件中plotdata函数是一样的。两个函数输入参数不同:
  mlxPlotdata(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]); 其中 nlhs,plhs分别表示输出参数的个数及输出参数的mxArray数组;nrhs,prhs表示输入参数的个数及输入参数数组。(这个函数有点通用的感觉……)
  mlfPlotdata(mxArray* rgbData); 就简单的多,基本和m文件中你定义的plotdata函数是一样的(我的plotdata定义为 function []=plotdata(rgbData))
  所以一般在程序中加载的是mlf开头的函数。
  这里需要提的是我编译生成的是C的动态链接库。如果是生成C++的动态链接库,生成的接口函数也带有一个mlx开头的函数,即
  bool MW_CALL_CONV mlxPlotdata(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[])
  但是另一个函数是不带有mlf的,直接为
  void MW_CALL_CONV plotdata(const mwArray& rgbData)
  而且输入参数不是mxArray数组,而是mwArray数组,这也是C和C++与MATLAB混合编程时最主要的不同(下篇再详细说)
  但是我在尝试C++动态链接时一直没有成功。后来看到生成的cpp文件同c文件一样也有一个 extend "C"{},这是C++为了与C兼容而提供的一个关键字,C++编译器将会在extend "C"的大括号内部代码当做C语言代码处理,这让我很困惑……而如果注释掉又会报连接错误托福答案
  想来可能是MATLAB对C++编译支持并不好(他自带的lcc编译器是只能编译成C的接口)总之没有尝试成功,暂时在程序中都用C的动态链接了。

时间: 2024-10-07 06:29:28

C++和MATLAB混合编程-DLL的相关文章

C#与MATLAB混合编程--DLL动态调用

一.MATLAB生成C#可调用的DLL MATLAB生成C#可调用的DLL可以使用MATLAB提供的deploytool工具.在命令行中敲入deploytool就可以打开这个工具.MATLAB编译器可能会需要提前配置. 打开工具对话框后填写项目名称.路径,并在type选项中选择.NET Assembly,这个选项能够生成用于C#的DLL. 完成后再左侧的.NET Assembly选项卡中点击编辑Class名称,然后在其下添加响应的m文件,如果m文件引用了其它的m文件,可以将所有关联的文件一起加入

C++和MATLAB混合编程-DLL篇

先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件加载入内存.并且DLL在运行时是共享的,即当多个程序调用时,内存中也只保持一份动态链接库. 动态链接库的调用有显式和隐式两种方式. 隐式链接需要用到我们前面生成的plotdata.c,plotdata.h,plotdata.lib以及plotdata.dll文件. 首先将plotdata.c,plo

VC与Matlab混合编程之调用动态链接库dll(C++)——<二>

VC与Matlab混合编程之调用动态链接库dll--<二> 1.是先建立 matlab 的 m 文件. ellipsefit.m 其包含:function [Xc,Yc,A,B,Phi,P]=ellipsefit(x,y) 2.MCC命令编译生成得到h.dll.lib等文件 在matlab命令行中输入: mcc -W cpplib:ellipsefit ellipsefit.m -T link:lib (此方式为c++风格函数) (具体命令含义可参考<精通matlab与C/C++混合程序

VC++和Matlab混合编程(在VC中调用将.m文件生成的DLL)

这是师兄们在实际项目中用到的关于VC++和MATLAB混合编程的实例.最近自己在瞎鼓捣,也就研究了下这块,本想写篇博文,但网上这块的资料还算是比较多,写的也比较具体,想着不重复劳动,因此我也就不写了. //提取节点信息 mxArray *csd_path; mxArray *save_path; mxArray *mat_path=mxCreateCellMatrix(NULL,NULL);//mxCreateCellMatrix:创建二维单位矩阵 mxArray *analog=mxCreat

c#与matlab混合编程探索

以下讲述如何使用c#来调用matlab函数实现北斗定位算法的仿真 1.准备 首先需要matlab2010,vs2010(其他版本是否可行,未知),另外需要安装matlab的辅助工具MCRInstaller(该工具无需下载,在安装好的matlab程序包中可以找到,例如:E:\matlab 2010\toolbox\compiler\deploy\win32) 2.准备matlab程序 上述截图是我的定位程序所涉及到的函数 3.matlab程序处理为dll文件,供c#调用,处理的基本步骤如下: (1

java/matlab混合编程应用移植到其他电脑上遇到的问题

问题1:jar包部署在其他电脑上设置vm参数无效 @echo off start java -Xmx1028M -Xms1028M -XX:PermSize=100M -XX:MaxPermSize=100M -XX:SurvivorRatio=8 -jar Edition_1.0_fat.jar 要把参数设置在前面才有效,开始把jar包放前面虽然自己电脑能运行但是其他人的电脑不能运行 问题2:# An unexpected error has been detected by HotSpot

VS2013调用MATLAB混合编程

Visual Studio和MATLAB混合编程,有两种方法: 1 MATLAB调用C程序: 2 VS调用MATLAB(目前见到的都是VS,其他编译器如codeblocks,或不提供这项功能): 前一种是用MATLAB的mex命令调用VS或其他编译器,将以一定方式编写出的C文件编译成.mexw32(针对win32)或者.mexw64(针对win64),然后MATLAB就可以用调用动态链接库的方式,调用C程序.这一过程中,只需要在安装好编译器的前提下,执行: mex -setup 和 mbuild

关于C++与Matlab混合编程错误??? Unexpected Standard exception from MEX file.

 最近在用c++和matlab 混合编程是遇到了一些问题,如下: ??? Unexpected Standard exception from MEX file. What() is:c:program Error in ==> mscale at 32 [rho,s] = matscale(abs(a),0.01); Error in ==> utScaledExpm at 7 [s,junk,a] = mscale(a,'noperm','safebal'); Error in ==&

C/C++与Matlab混合编程初探

欢迎转载,尊重原创,所以转载请注明出处. http://blog.csdn.net/bendanban/article/details/37830495 Matlab 拥有丰富的功能,编程简单.不过,有些情况下,Matlab程序的执行速度比较慢.C/C++编译执行的程序速度比较快,编程难度上比Matlab要高一些.因此存在一种方案,就是使用Matlab实现我们的实验程序,用C/C++来实现Matlab程序中比较耗时的部分,从Matlab程序中调用C/C++的程序以实现加速. 本文主要讲解如何在M