在Visual Studio中使用C++中调用MATLAB程序

在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目的。

预先提示:这样编出的程序仍要调用Matlab底层DLL库,摆脱不了DLL底层库的支持,如果移植到无matlab环境的机器,需要安装MCR进行运行环境的支持。

本文档记录了Matlab 2019b,windows 10 x64, Visual studio 2015(解决方案平台为x64)的环境下的配置情况。 经过测试,本文档的方法对R2016a Runtime环境不可用,会报错.

准备matlab程序

编好matlab程序,例如,顶层应为如下格式:

function [c] = myAdd(a,b)

c=a+b;

return;

end

使用matlab生成dll(Dynamic Linked Library)文件

需要带有mcc编译器的matlab软件,这个可以通过在matlab命令行中输入:!mcc命令来查看: 仔细阅读打印信息之后,可以看到mcc编译器的命令使用方法。然后输入mex -setup设置语言为C++。

然后在命令窗口输入mbuild -setup选中要使用的 C++ 编译器,而不是 C 编译器,在这里请选择你需要的C++编译器,尽量与C++程序开发使用的编译器保持一致。比如可以使用Visual Studio自带的Microsoft Visual C++ 2015 Professional编译器,或者其他IDE中的MINGW编译器。

选好编译器后在命令窗口输入deploytool进入编译窗口,在弹出的窗口中选择 Library Compiler ,即生成dll动态链接库的形式,之后会弹出如下窗口。

在MATLAB Complie对话框中的左上角APPLICATION TYPE中选择C++ Shared Library类型,在旁边的白色框中点击加号将需要编译成dll的.m文件添加到当前项目中,选择API 类型为默认的Create all interfaces,在Samples部分选择Create New Sample,然后点击myAdd.m可以看到生成了一个样例文件。然后可以点击右上角的package按钮生成dll文件了。

等待一段时间之后就可以在指定的目录下for_redistribution_files_only文件夹内看到生成dll以及相应的.h和.lib文件。

mwArray API interface对应.h,.dll和.lib; Matlab数据格式API对应v2文件夹下的.ctf等。 samples根据样例.m文件,例化了可用的应用程序样例文件.

在VS中调用matlab程序中的函数

使用Visual Studio新建一个win32的空的控制台项目,同时将刚刚生成的myAdd.h存放在当前项目目录下,建立lib文件夹(专门用来存放.lib文件),将myAdd.lib拷贝到该文件夹下,将myAdd.dll存放在x64/Debug目录下。然后输入C++的应用程序代码:

#include

#include "mclmcr.h"

#include "mclcppclass.h"

#include "matrix.h"

#include "myAdd.h"

//环境变量在安装有matlab的机器上的设置为PATH: D:\Program\MATLAB\R2016a\bin\win64时可以正常运行。

//在Runtime环境下报错

//

using namespace std;

int main()

{

if (myAddInitialize())//必须要初始化,格式为 [名字]Initialize()

{

cout << "初始化完成!" << endl;

}

else

{

cout << "初始化失败!" << endl;

}

//定义3个mwArray类型变量,用于存放矩阵

mwArray a(2, 3, mxDOUBLE_CLASS);

mwArray b(2, 3, mxDOUBLE_CLASS);

mwArray c(2, 3, mxDOUBLE_CLASS);

double x[] = { 2,3,1,5,4,5 };

double y[] = { 8,8,7,9,11,12 };

double *sum = new double[6]; //注意这个是指针

// 给输入 mxArray 对象赋值

a.SetData(x, 6);

b.SetData(y, 6);

//调用DLL函数

myAdd(1, c, a, b);

//获取结果

c.GetData(sum, 6);

//输出结果

for (int i = 0; i < 2; i++)

{

for (int j = 0; j < 3; j++)

cout << sum[j * 2 + i] << " ";

cout << endl;

}

cout << "it is successful !" << endl;

return 0;

}

然后点击菜单栏下的项目->属性,在项目属性对话框VC++选项中,设置包含目录为mylib.h的存放目录,以及matlab环境的包含目录D:\Program Files (x86)\Matlab2018a\extern\include。库目录为mylib.lib的存放目录及MATLAB环境的库目录,如D:\Program Files (x86)\Matlab2018a\extern\lib\win64\microsoft。链接器->输入选项中,附加依赖项:

libmat.lib

libmex.lib

mclmcr.lib

mclmcrrt.lib

mclbase.lib

myAdd.lib

并拷贝matlab的lib文件到lib目录中。 8. 依赖MATLAB环境运行: 环境变量中还要添加D:\Program Files (x86)\Matlab2018a\bin\win64等才可以正常运行。如果没有安装matlab,还需要安装MCR,并设置环境变量.

将上面生成的可执行文件.exe拷贝到你的Qt工程release/debug后生成的exe文件的同一目录下,并在Qt中运行该.exe程序即可。

补充知识:静态编译与动态编译

静态编译:编译器在把源文件(.cpp文件)编译可执行文件(.exe文件)时,主程序中调用的函数接口通过查询包含的头文件(.h),把源文件中要调用的函数代码,翻译为库文件(.lib),然后链接到可执行文件中去,使可执行文件在运行时不需要依赖于动态链接库(.dll文件)。

动态编译:编译器在把源文件(.cpp文件)编译可执行文件(.exe文件)时,主程序中调用的函数接口通过查询包含的头文件(.h),把源文件中要调用的函数代码,翻译为动态链接库文件(.dll),然后链接到可执行文件(.exe)中,在运行时,可执行文件通过查询导出库(.lib)文件,在动态链接库(.dll)中查找函数命令。所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。

文件后缀名

文件名称

作用

文件所在目录的名称

.c,.cpp,.cc

源文件

开发者用来写程序的

源代码目录

.h

头文件

声明应用程序的函数接口

包含目录

.lib

库文件-附加依赖项

动态库中的lib包括函数在DLL中的位置信息;静态库中不止包含位置信息,还有函数代码

库目录

.dll

动态链接库文件

动态库中的DLL文件包含了所有库函数

库目录

在matlab中 编程n,Matlab与C++混合编程 1--在C++中调用自己写的matlab函数相关推荐

  1. 物联网中C语言与汇编语言,ARM Cortex-M架构CPU中C语言和汇编语言的混合编程

    这里主要从3个方面讲一下C和汇编的混合编程,包括相互之间的函数调用 1 汇编代码中调用C函数 在汇编中调用C的函数,需要在汇编中IMPORT 对应的C函数名,然后将C的代码放在一个C文件中进行编译 我 ...

  2. 在OC项目中添加Swift文件并实现混合编程

    对于已经工作的开发者,并不适合也没有条件从一个全新的swift项目开始,进行开发. 虽然网上关于swift和oc混合编程的教程比较多,但是大多是基于 swift项目的,所以对咱们 OCer的参考价值有 ...

  3. 汇编和c语言混合编程缺点,汇编C语言混合编程经验总结

    ARM汇编语言和C语言混合编程 ATPCS规灾了一种模块化设计的观念,其基本内容是C模块(函数)和汇编模块(函数)相互的一套规?中还有类似的一套规晕腋芯谙呋惚喙δ芮看用有很多忌讳),厅知道(很寄几它/ ...

  4. 简述arm汇编和c语言混合编程,ARM汇编C语言混合编程

    3.4 ARM汇编&C语言混合编程 3.4.1 C内联ARM汇编 先看一个例子: # cat add.c 1 // add.c for s3c2410c board 2 // arm-linu ...

  5. matlab如何打开dcm_MatLab 与 visual studio 混合编程环境配置

    一.本文可以应用与以下matlab和visual studio版本: MatLab: Matlab2017a,Matlab2017b,Matlab2018a,MatLab2018b,MatLab201 ...

  6. python如何调用自己写的matlab函数和mat数据

    1. 确保matlab版本和python版本配套 如何不配套,下载一个anaconda,打开anaconda propmt 假如你本来是python3.9 要降级到3.8,打开之后输入: conda ...

  7. ARM中C语言和汇编语言的混合编程

    1.内联汇编 在C语言中内嵌汇编注意事项: 不能直接向PC寄存器赋值,程序跳转要使用B或者BL指令在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突R12和R13可能被编译器用来存放中 ...

  8. qt 调用qpainter_在Qt5.4中如何实现QOpenGLWidget和QPainter混合编程

    在Qt5.4的Example中,有一个例子qopenglwidget,介绍了QOpenGLWidget和QPainter,但是在使用过程中,需要注意哪些方面呢?我在最初使用的时候就遇到两者不能同时使用 ...

  9. python c 混合编程 用c循环_混合编程:用 C 语言来扩展 Python 大法吧!

    Python 实在是一种让人上瘾的编程语言,简洁的语法+丰富的扩展包,几乎可以用 Python 做任何事情,唯一的黑点似乎就是「慢」,但是与高效的编译语言 C\C++ 互联以后,可以解决脚本语言运行速 ...

最新文章

  1. 机器学习系列-随机过程
  2. Android SQLite开发调试工具 Android Debug Database
  3. node.js mysql防注入_避免Node.js中的命令行注入安全漏洞
  4. 【PTA天梯赛CCCC -2017决赛L1-6 】整除光棍 (20 分)(大数模拟除法)
  5. Atitit 常见集合的操作 dsl表达式 选择器 多属性条件检索 ,排序等 目录 1. Ognl 集合操作 1 2. /bookmarksHtmlEverythingIndexPrj/src/Li
  6. (九)Linux系统运维-常用软件包管理
  7. c# midi播放器_C#中的MIDI文件切片器和MIDI库
  8. java web课程设计目的_javaweb课程设计
  9. 360机器学习算法工程师面经
  10. PPT中如何制作遮罩动画效果
  11. 高通功耗调试17之TLOC DEAMON导致待机/亮屏电流异常问题
  12. html中页面目录虚线怎么做,html中文本下面怎么有虚线
  13. 无锡高二计算机会考内容,无锡期中考试卷分析,看一看高一高二高三数学都考了哪些...
  14. shadowgun的飘扬旗帜shader
  15. 案例实践:用SPSS做K均值聚类分析
  16. 闹闹天宫一直显示服务器错误,闹闹天宫常见问题FAQ
  17. 轻便易用的三维建模软件
  18. mathtype在word出现宏被禁止的错误 终于解决
  19. 云宏刘建平:细说中小企业如何上云
  20. PT100高精度测温电路 AD623+REF3030(转)

热门文章

  1. socket调试工具、socket调试软件、tcp调试工具、tcp调试软件(sokit),C#sokit工具包及其sokit使用说明
  2. 学python对工作有什么帮助_学python有什么好处 学好了能干什么
  3. 第10章 基础API与常见算法
  4. 【学习计算机组成原理】浮点数的加减运算
  5. mybatis什么时候用的${}
  6. Leetcode刷题——每日一题题目汇总
  7. 揭秘宜信财富年度账单的技术实现
  8. 显示百度地图要注意的:试用setContentView前初始化BMapManager对象,否则会报错
  9. 常被大众误以为是外国佬研发的四款国产软件,建议低调收藏
  10. 入手评测 r5 5600x和r7 5700g选哪个好