Matlab与C++混合编程 1--在C++中调用自己写的matlab函数
在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 <iostream>
#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与C++混合编程 1--在C++中调用自己写的matlab函数的更多相关文章
- Java语言与C语言混合编程(2)--在Java中调用C语言本地库
在上一篇文章中介绍了Java语言中的native关键字,以及Java语言调用C语言的编译生成本地动态链接库(DLL)实现加法运算的小例子,本文通过一个更加详细的例子,深入讲解Java语言调用C语言的函 ...
- 【目录】Matlab和C#混合编程文章目录
本博客所有文章分类的总目录链接:[总目录]本博客博文总目录-实时更新 1.Matlab和C#混合编程文章目录 9.接触Matlab10年后的一个总结,随时使用Matlab要掌握的一些要点 8.国内第一 ...
- 算法库:Matlab与C++混合编程
算法库:Matlab与C++混合编程 最近做光流算法预演过程中,下载的源码中涉及到了Matlab和C++的混合编程.在同事Matlab2014的环境下,程序到是一下就运行通过了.但在我这Matlab2 ...
- Matlab与.NET混合编程解决人脸识别问题
原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ht ...
- Matlab与C++混合编程(依赖OpenCV)
Matlab与C++混合编程实际上就是通过Matlab的Mex工具将C++的代码编译成Matlab支持调用的可执行文件和函数接口.这样一方面可以在Matlab中利用已经编写好的函数,尽管这个函数是用C ...
- matlab与vs混合编程/matlab移植
前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部 ...
- matlab和c++混合编程---matlab和vs的环境配置问题及方法和步骤(转载)
matlab和c++混合编程---方法和步骤 matlab和c++混合编程---matlab和vs的环境配置问题 摘要:Matlab具有很强的数值计算和分析等能力,而C/C++是目前最为流行的高级程序 ...
- [转] Matlab与C++混合编程(依赖OpenCV)
作者 zouxy09@qq.com,原文 Matlab与C++混合编程(依赖OpenCV) 之前在运行别人论文的代码的时候,经常有遇到Matlab与C++混合编程的影子.实际上就是通过Matlab的M ...
- [转] Matlab与C++混合编程,添加OpenCV库
原文地址 峰回璐转 最近在做运动医学软件优化工作,此款软件框架及算法语言全由matlab实现,虽然matlab矩阵运算.数值计算能力强大,但速度让人难以忍 受.软件立刻移植到C++上又不太实际,故采用 ...
随机推荐
- centos7使用cron任务的相关命令(与centos6有区别)
一.cron任务的自启动相关命令 1.检测cron定时服务是否自启用 systemctl is-enabled crond.service 结果展示如下: enable表示已启用自启动 disable ...
- P1903 奖学金题解
众所周知,这是一道通过struct结构体进行排序的题目 思路:平常的输入.. 然后定义一个结构体grade,存放每个学生的学号.三科成绩.(也可以只存语文成绩和总分和学号) 自定义cmp函数,通过三层 ...
- zabbix服务的布置(脚本)
一,服务端配置 #!/bin/bash#clsn #设置解析 注意:网络条件较好时,可以不用自建yum源# echo '10.0.0.1 mirrors.aliyuncs.com mirrors.al ...
- Solaris 11中配置基于link的IPMP
http://blog.itpub.net/29960937/viewspace-1347901/ Tips: Record and feedback errors you have encounte ...
- 【转】js监听浏览器离开页面操作
[转]https://www.cnblogs.com/slly/p/7991474.html 序言 大家是否经常遇到在关闭网页的时候,会看到一个确定是否离开当前页面的提示框?想一些在线测试系统.信息录 ...
- java数据结构5--集合Map
Map Map与Collection在集合框架中属并列存在 Map存储的是键值对<K,V> Map存储元素使用put方法,Collection使用add方法 Map集合没有直接取出元素的方 ...
- java数据结构--array与ArrayList的区别
ArrayList 内部是由一个array 实现的. 如果你知道array 和 ArrayList 的相似点和不同点,就可以选择什么时候用array 或者使用ArrayList , array 提供 ...
- LeetCode - 环形链表检测
方法一:哈希表 # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # se ...
- node 中process进程argv,argv0,execArgv,execPath
1.argv const {argv,argv0,execPath v,execPath} = process; argv.forEach(item=>{ console.log(item); ...
- 全方面了解和学习PHP框架 PHP培训教程
PHP成为最流行的脚本语言有许多原因:灵活性,易用性等等.对于项目开发来说,我们通常需要一个PHP框架来代替程序员完成那些重复的部分.本文,兄弟连将对PHP框架进行全面解析. PHP框架是什么? PH ...