作者:朱金灿

来源: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混合开发经验总结的更多相关文章

  1. VC 与Matlab混合编程之引擎操作详解

    Visual C++ 是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快.但在科学计算方面函数库显得不够丰富.读取.显示数据图形不方便. Matlab 是一款将数值分析.矩阵计算.信 ...

  2. VC和matlab混合开发学习

    作者:朱金灿 来源:http://blog.csdn.net/clever101 第一种方式是直接调用Matlab Engine的接口.Matlab Engine 采用Client/Server的方式 ...

  3. VC和matlab混合开发遇到的问题及其解决办法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 1. error C2011: '_INTERFACE_INFO' : 'struct' type redefinit ...

  4. VC和MATLAB混合开发需要注意的一个问题

    作者:朱金灿 来源:http://blog.csdn.net/clever101 如果你的操作系统是64位操作系统,那么直接运行MATLAB的安装文件下的Setup.exe会默认安装的是64位的MAT ...

  5. matlab混合编程向导(vc,vb,.net...)

    一.matlab与vc混编  1.通过mcc将matlab的m文件转化为cpp,c文件或dll供vc调用:     这方面的实现推荐精华区Zosco和ljw总结的方法(x-6-1-4-3-1和2)  ...

  6. C++和MATLAB混合编程求解多项式系数(矩阵相除)

    摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...

  7. C++和MATLAB混合编程-DLL

    先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件 ...

  8. java matlab混合编程之返回值Struct类型

    java matlab混合编程的时候当返回值是Struct类型(matlab中的返回类型)如何来取得(java中)其值? 上网找,看到这个网页:http://www.mathworks.cn/cn/h ...

  9. WPF(C#)与MATLAB混合编程

    WPF(C#)与MATLAB混合编程 WPF可以为开发者提供便捷地构建用户交互界面的解决方法,而matlab则在科学计算方面有着无与伦比的优势,因此在一些需要将科学算法转换为应用软件的项目中,需要应用 ...

随机推荐

  1. Java的IO流架构

    输入输出是指应用程序与外部设备及其他计算机进行数据交流的操作,如读写硬盘数据.向显示器输出数据.通过网络读取其他节点的数据等.任何一种编程语言必须拥有输入输出的处理方式,Java语言也不例外.Java ...

  2. VS中创建自定义一个VC工程为基础的开发向导的总结

    作者:朱金灿 来源:http://blog.csdn.net/clever101 VS允许用户进行自定义开发向导.自定义开发向导的好处在于将常用的设置都通过向导生成,从而大大提供开发效率.特别是在开发 ...

  3. JavaScript学习总结(9)——JS常用函数(一)

    本文中,收集了一些比较常用的Javascript函数,希望对学习JS的朋友们有所帮助. 1. 字符串长度截取 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 ...

  4. Spring3 整合MyBatis3 配置多数据源 动态选择SqlSessionFactory(转)

    1. Spring整合MyBatis切换SqlSessionFactory有两种方法,第一. 继承SqlSessionDaoSupport,重写获取SqlSessionFactory的方法.第二.继承 ...

  5. 【LeetCode-面试算法经典-Java实现】【144-Binary Tree Preorder Traversal(二叉树非递归前序遍历)】

    [144-Binary Tree Preorder Traversal(二叉树非递归前序遍历)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a bina ...

  6. [分享]ip地址爬取过滤的shell

    http://www.hbbzy.me/分享ip地址爬取过滤的shell #!/bin/base #ip zhi地址匹配 #获取最新的ip地址 #author:haifeng #wget ftp:// ...

  7. 非阻塞键盘检测getchar()

    #include <stdio.h> #include <conio.h> #include <Windows.h> int main() { char c; wh ...

  8. BZOJ3160: 万径人踪灭(FFT,回文自动机)

    BZOJ传送门: 解题思路: FFT在处理卷积时可以将自己与自己卷,在某一种字母上标1其他标0,做字符集次就好了. (回文就是直接对称可以联系偶函数定义理解,根据这个性质就可以将字符串反向实现字符串匹 ...

  9. socket 笔记(一)

    #include "stdafx.h" #include "WINSOCK2.H" #pragma comment(lib,"WS2_32.lib&q ...

  10. CISP/CISA 每日一题 13

    监控信息系统人员所提供服务的效率和效果的工具: 1.例外报告:识别所有没有成功完成的或出了故障的应用 2.作业重运行报告:大多数异常终止作业都会导致重起 3.操作员问题报告:记录计算机运行问题及解决方 ...