matlab封装DLL动态链接库 再用VS2010调用(matlab VS混合编程)

本文主要是介绍matlab封装DLL动态链接库 再用VS2010调用(matlab VS混合编程),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

matlab封装DLL动态链接库 再用VS2010调用(matlab VS混合编程)(转载) 

 

转载自:http://blog.csdn.net/cjl19880906/article/details/12177641

整个配置调试过程使用的环境为matlab2011a(version 7.12.0.635),VS2010,操作系统是window7

 

一,设置操作系统的环境变量。

系统变量增加D:\R2011a\bin\win32;D:\R2011a\bin和E:\Microsoft VisualStudio 10.0\VC\bin,这个分别是我的机器上matlab和VS安装目录下的路径。

系统变量设置完毕后需要重新启动计算机方能生效。

二,设置matlab的编译环境

在matlab中输入命令mex -setup,选择Microsoft Visual C++ 2010

再输入命令mbuild -setup 同样选择Microsoft Visual C++ 2010

p.s. 这一步中,在我自己配置的过程中,matlab可以很容易的识别出机器上装有的编译器以及他们的安装路径,其中包括VS2010,选择它就是了。也许有的环境下matlab不一定能找出VS2010中的VC编译器,这个怎么解决就不知道了。

三,matlab编译.m文件

输入mcc -W cpplib:yourfunLib -T link:lib yourfun.m

其中,yourfunLib是生成的DLL,Lib的前缀名字,也就是你最后可以是使用的DLL以及Lib库的名字;yourfun是你需要编译的.m函数。

编译完成后得到了下图中的一些文件:

 

这些文件中后缀为DLL,LIB,H的文件在VS调用的时候有用,其他文件目前没有使用。(这里我把yourfunLib指定为aetherLib了)

四,VS2010 的配置

新建一个控制台项目。

打开项目的属性页,针对这个项目做如下的设置:

1.VC++目录下的包含目录添加

D:\R2011a\extern\include(matlab安装目录下的路径)

D:\R2011a\extern\include\win32  (matlab安装目录下的路径,下同)

C:\Users\lenovo\Desktop\aether\aether  (你自己新建的项目中的路径,下同)

2.VC++目录下的库目录添加

D:\R2011a\bin\win32

D:\R2011a\extern\lib

C:\Users\lenovo\Desktop\aether\aether

D:\R2011a\extern\lib\win64\microsoft

D:\R2011a\extern\lib\win32\lcc

D:\R2011a\extern\lib\win32\microsoft

3.c/c++中的常规里面的附加包含目录添加

D:\R2011a\extern\include

4.连接器下面的常规中的附加库目录添加

D:\R2011a\extern\lib\win32\microsoft

5.连接器下面的输入中的附加依赖项添加

libeng.lib

libmat.lib

libmex.lib

libmx.lib

mclmcrrt.lib

mclmcr.lib

aetherLib.lib(这个是你自己用matlab生成的lib,前面的是matlab自身计算引擎中的lib)

在解决方案资源管理其中的头文件和资源文件中添加文件

1.在头文件中添加生成的.h文件

2.在资源文件中添加.lib,.dll文件

3.然后 把.h,.lib,.dll文件拷到你新建的项目的目录下。比如我把他们放到了C:\Users\lenovo\Desktop\aether\aether里面。

(最好是用这个命令进行编译 mcc -W cpplib:MyAddLib -T link:lib MyAdd.m -C

然后把.ctf文件也拷过去。)

编写代码调用dll中的函数

dll中的函数的接口形式在.h文件的最后面给出了,你可以去翻看他接口形式。这里面的函数的输入输出参数都得是mwArray对象的常引用,关于这个类请读者自己去网上搜索资料。你需要搞明白的是mwArray是matlab公司专门针对“c++调用matlab生成的dll“而设计的类,因为你包含了matlab安装目录下的这些类,所以你可以在VS里使用它们。

下面是一段主函数的编写样例:

// newdll.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include

#include "engine.h"

#include "mclmcr.h"

#include "mclcppclass.h"

#include "libMyAdd.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

 if(!libMyAddInitialize())

   {

   //initilize failed!!!"<<std::endl;

    std::cout<<"错误..."<<std::endl;

   return -1;

   }

 double a = 6;

double b = 9;

double c;

mwArray mwA(1, 1, mxDOUBLE_CLASS);

mwArray mwB(1, 1, mxDOUBLE_CLASS);

mwArray mwC(1, 1, mxDOUBLE_CLASS);

mwA.SetData(&a, 1);

mwB.SetData(&b, 1);

MyAdd(1, mwC, mwA, mwB);

c = mwC.Get(1,1);

cout<<c<<endl;

system("PAUSE");

 return 0;

}

这个dll中的函数只是实现了一个简单的两数相加的功能,是我做基本配置是使用的。

 #include "engine.h"

#include "mclmcr.h"

#include "mclcppclass.h"

#include "libMyAdd.h"       这些头文件是必须包含的,其中engine好像是包含了matlab计算引擎中的所有dll(还没有认真考证)

现在,运气好的话你应该能看到你预想中的输出了。如果出现了问题,比如找不到路径,不可访问等等各种错误,那只能你自己去解决了,我搞了整整3天,上面提到的错误都有遇到。  出了错误你可以尝试去百度搜索其他博客,更好的是去google用英文搜索相关的问题,一些社区里面也许有答案呢,matlab版主文档我倒是没仔细看,也许上面也有不错的帮助呢! good luck  to you!

备注:

1.我自己在搞的时候,遇到的问题是.m函数中本身就使用了c++语言编写的dll,然后再封装这个.m函数。这种情况下你得保证VS可以访问到你用到的那些用C++书写的dll。但是只要用mcc命令编译.m函数后,你在连接器下面的输入中的附加依赖项中只需添加.m 生成的dll函数就可以了,不需要添加那些c++代码生成的dll。这里建议你把matlab项目拷到VS项目中,直接在Vs项目中工作进行MCC编译。

 2.主函数代码中if(!libMyAddInitialize())是必须的。

这篇关于matlab封装DLL动态链接库 再用VS2010调用(matlab VS混合编程)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/686815

相关文章

qt5cored.dll报错怎么解决? 电脑qt5cored.dll文件丢失修复技巧

《qt5cored.dll报错怎么解决?电脑qt5cored.dll文件丢失修复技巧》在进行软件安装或运行程序时,有时会遇到由于找不到qt5core.dll,无法继续执行代码,这个问题可能是由于该文... 遇到qt5cored.dll文件错误时,可能会导致基于 Qt 开发的应用程序无法正常运行或启动。这种错

电脑提示xlstat4.dll丢失怎么修复? xlstat4.dll文件丢失处理办法

《电脑提示xlstat4.dll丢失怎么修复?xlstat4.dll文件丢失处理办法》长时间使用电脑,大家多少都会遇到类似dll文件丢失的情况,不过,解决这一问题其实并不复杂,下面我们就来看看xls... 在Windows操作系统中,xlstat4.dll是一个重要的动态链接库文件,通常用于支持各种应用程序

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

VS配置好Qt环境之后但无法打开ui界面的问题解决

《VS配置好Qt环境之后但无法打开ui界面的问题解决》本文主要介绍了VS配置好Qt环境之后但无法打开ui界面的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目UKeLvb录找到Qt安装目录中designer.UKeLvBexe的路径找到vs中的解决方案资源

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性

使用Python实现调用API获取图片存储到本地的方法

《使用Python实现调用API获取图片存储到本地的方法》开发一个自动化工具,用于从JSON数据源中提取图像ID,通过调用指定API获取未经压缩的原始图像文件,并确保下载结果与Postman等工具直接... 目录使用python实现调用API获取图片存储到本地1、项目概述2、核心功能3、环境准备4、代码实现

电脑提示Winmm.dll缺失怎么办? Winmm.dll文件丢失的多种修复技巧

《电脑提示Winmm.dll缺失怎么办?Winmm.dll文件丢失的多种修复技巧》有时电脑会出现无法启动程序,因为计算机中丢失winmm.dll的情况,其实,winmm.dll丢失是一个比较常见的问... 在大部分情况下出现我们运行或安装软件,游戏出现提示丢失某些DLL文件或OCX文件的原因可能是原始安装包

无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案

《无法启动此程序因为计算机丢失api-ms-win-core-path-l1-1-0.dll修复方案》:本文主要介绍了无法启动此程序,详细内容请阅读本文,希望能对你有所帮助... 在计算机使用过程中,我们经常会遇到一些错误提示,其中之一就是"api-ms-win-core-path-l1-1-0.dll丢失

使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案

《使用@Cacheable注解Redis时Redis宕机或其他原因连不上继续调用原方法的解决方案》在SpringBoot应用中,我们经常使用​​@Cacheable​​注解来缓存数据,以提高应用的性能... 目录@Cacheable注解Redis时,Redis宕机或其他原因连不上,继续调用原方法的解决方案1

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序