VC和MATLAB混合开发经验总结
作者:朱金灿
来源:http://blog.csdn.net/clever101
前期准备:
1.请确认机器中已经安装Matlab主程序或(MCR)MATLAB Compiler Runtime(具体到matlab安装目录下搜索MCRInstaller.exe)。
2.准备好MATLAB编译好的C/C++文件:包括<my_dll>.h<my_dll>.lib <my_dll>.dll
其中<my_dll>为生成的文件名。
建立工程:
1.新建一个工程。将<my_dll>.h、<my_dll>.lib拷贝到工程文件夹下
<my_dll>.dll拷贝到输出目录。
2.将<my_dll>.h添加到工程中。
3.在工程属性页 -> C/C++ -> 附加的包含目录 选项中添加包含目录
<you_dir>\R2009a\extern\include
注:<you_dir>为计算机中matlab的安装位置。
若以添加系统环境变量则可跳过这一步。
若没有安装matlab,只安装MCR,则到MCR目录下找\extern\include 也可。
4.在工程属性页 -> 链接器 -> 附加库目录 选项中添加包含目录
<you_dir>\R2009a\extern\lib\win32\microsoft
注:<you_dir>为计算机中matlab的安装位置。
若没有安装matlab,只安装MCR,则到MCR目录下找\extern\lib\win32\microsoft 也可。
5.在工程属性页 -> 链接器 -> 输入 -> 附加依赖项 中添加依赖项
mclmcrrt.lib mclmcr.lib dlltest.lib
调用dll:
1.先执行mclInitializeApplication(NULL,0)以初始化MCR库,请检测返回值以确认初始化成功。
2.执行<my_dll>.h 中的 <my_dll>Initialize(void)以初始化DLL,请检测返回值以确认初始化成功。
注:初始化可以放到构造函数中运行。
3.执行函数操作如mlfDraw_test(int nargout,mxArray** y)。
注:若有图形界面函数为异步调用,既显示图像后即返回值。
可以用mclWaitForFiguresToDie(NULL)来阻塞线程等待Matlab窗口关闭。
*调用前请确认MCR及dll初始化成功,若不成功调用函数可导致程序崩溃。
4.执行完函数后调用<my_dll>Terminate(void)来结束DLL。
5.最后调用mclTerminateApplication()来结束MCR库。
注:执行4函数时请确认所有Matlab已经关闭。
如在有Matlab窗口时执行4函数可能发生未知错误!
有如下两种方法确认:
1.调用mclWaitForFiguresToDie(NULL)来阻塞线程等待Matlab窗口关闭。
2.调用mclKillAllFigures(NULL)来强制关闭所有Matlab窗口。
*注:上述4、5两个函数请勿放置在析构函数中是执行,若这样做有可能发生未知错误!
请在宿主对象析构函数之前调用上述4、5函数!
3.部署调用matlab的程序时在安装MCR后,需要在Path环境变量设置MCR的路径,具体是setPATH=<mcr_root>\v710\runtime\win32;%PATH%
第二部分Matlab编译C/C++dll:
Matlab 生成DLL
编译器的安装
在matlab中先安装编译器,我在第一次安装的时候一路y下来,
只有一个compiler,还是最老的。这教育我们要学会说N,按照以下步骤操作
>>mbuild -setup
Pleasechoose your compiler for building standalone MATLAB applications:
Wouldyou like mbuild to locate installed compilers [y]/n? n
Selecta 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 SP1
[5]Microsoft Visual C++ 2008 Express
[6]Microsoft Visual C++ 2008 SP1
[0]None
Compiler:6
Thedefault location for Microsoft Visual C++ 2008 SP1 compilers is C:/ProgramFiles/Microsoft Visual Studio 9.0,
butthat directory does not exist on this machine.
UseC:/Program Files/Microsoft Visual Studio 9.0 anyway [y]/n? n
Pleaseenter the location of your compiler: [C:/Program Files/Microsoft Visual Studio9.0] <you_dir_VS>/Microsoft Visual Studio 9.0
Pleaseverify your choices:
Compiler:Microsoft Visual C++ 2008 SP1
Location:e:/Program Files/Microsoft Visual Studio 9.0
Arethese correct [y]/n? y
****************************************************************************
Warning: Applications/components generatedusing Microsoft Visual Studio
2008 require that the Microsoft VisualStudio 2008 run-time
libraries be available on the computer usedfor deployment.
To redistribute your applications/components,be sure that the
deployment machine has these run-timelibraries.
****************************************************************************
Tryingto update options file: C:/Users/Administrator/AppData/Roaming/MathWorks/MATLAB/R2009a/compopts.bat
Fromtemplate: E:/PROGRA~1/MATLAB/R2009a/bin/win32/mbuildopts/msvc90compp.bat
Done. . .
DLL的生成
首先新建一个m文件,文件名为myadd2.m,定义了一个名为myadd2的函数,代码如下:
function [y,z] = myadd2(a, b)
% dummy function, just to demonstrate the idea
y = a+b;
z = a+2*b;
end
在MATLAB命令框中输入以下命令:
mcc -W cpplib:libmyadd2 -T link:lib myadd2.m
在编译生成C++库后同时生成一个readme文件,这个文件就是告诉你以后部署软件时该安装哪些库的。
VC和MATLAB混合开发经验总结的更多相关文章
- VC 与Matlab混合编程之引擎操作详解
Visual C++ 是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快.但在科学计算方面函数库显得不够丰富.读取.显示数据图形不方便. Matlab 是一款将数值分析.矩阵计算.信 ...
- VC和matlab混合开发学习
作者:朱金灿 来源:http://blog.csdn.net/clever101 第一种方式是直接调用Matlab Engine的接口.Matlab Engine 采用Client/Server的方式 ...
- VC和matlab混合开发遇到的问题及其解决办法
作者:朱金灿 来源:http://blog.csdn.net/clever101 1. error C2011: '_INTERFACE_INFO' : 'struct' type redefinit ...
- VC和MATLAB混合开发需要注意的一个问题
作者:朱金灿 来源:http://blog.csdn.net/clever101 如果你的操作系统是64位操作系统,那么直接运行MATLAB的安装文件下的Setup.exe会默认安装的是64位的MAT ...
- matlab混合编程向导(vc,vb,.net...)
一.matlab与vc混编 1.通过mcc将matlab的m文件转化为cpp,c文件或dll供vc调用: 这方面的实现推荐精华区Zosco和ljw总结的方法(x-6-1-4-3-1和2) ...
- C++和MATLAB混合编程求解多项式系数(矩阵相除)
摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...
- C++和MATLAB混合编程-DLL
先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件 ...
- java matlab混合编程之返回值Struct类型
java matlab混合编程的时候当返回值是Struct类型(matlab中的返回类型)如何来取得(java中)其值? 上网找,看到这个网页:http://www.mathworks.cn/cn/h ...
- WPF(C#)与MATLAB混合编程
WPF(C#)与MATLAB混合编程 WPF可以为开发者提供便捷地构建用户交互界面的解决方法,而matlab则在科学计算方面有着无与伦比的优势,因此在一些需要将科学算法转换为应用软件的项目中,需要应用 ...
随机推荐
- 认知 Git 和 GitHub
今天被一个大牛的大哥问了个问题,问住了.原问题是“你是到github吗?git呢?” 我堂而皇之的说,“他们不是同一个吗?” 结果大牛大哥狠狠地回了我一句“百度去”..好吧我乖乖去百度了. 这是我百度 ...
- javaweb一
JavaWeb就是在服务器端以Java语言为解释运行基础的web程序. php代码要想在服务器端运行,需要在服务器软件(通常是Apache)上加php的解释器,Java也一样,但是这个解释器是Tomc ...
- html页面中块级元素的居中
第一:在页面中使用 margin: 0 auto;居中: <div> <p>夜屋</p> </div> div { width: 100%; posit ...
- docker的数据持久化
挂载宿主机的目录(实现很多容器共用一个宿主卷) [root@localhost ~]# docker run -itd --name web01 -v /var/www/html:/var/www/h ...
- java bigdecimal (java double也时会失真)
BigDecimal加减乘除运算 2011-11-21 21:22 6470人阅读 评论(0) 收藏 举报 stringdivjavaup工具 java.math.BigDecimal.BigDeci ...
- 如何优雅的写UI——(6)内存泄漏
控件讲了这么久,其实我的程序有两个Bug不知道大家有没有发现,这两个Bug都不会报错,对程序运行来说都没有阻碍,但是这种Bug对整个代码来说是一个很大的安全隐患. 什么是内存泄漏 内存泄漏(Memor ...
- UVA - 10167 - Birthday Cake (简单枚举)
思路:简单枚举 AC代码: #include <cstdio> #include <cstring> #include <iostream> #include &l ...
- 漫话C++之string字符串类的使用(有汇编分析)
C++中并不提倡继续使用C风格的字符串,而是为字符串定义了专门的类,名为string. 使用前的准备工作 在使用string类型时,需要包含string头文件,且string位于std命名空间内: # ...
- 根证书 CA
根证书 CA 密钥没有密码,使用下面的指令添加密码 openssl rsa -aes256 -in cakey_nopw.pem -out cakey_pw.pem cacert.pem -----B ...
- worktools-git 工具的使用总结(2)
1.创建分支 git branch son parent //创建分支,是在master 分支的基础上创建 :~/myGit$ git st # On branch master nothing to ...