C++调用MATLAB程序进行混合编程以及常见问题解决
C++调用MATLAB程序进行混合编程以及常见问题解决
- C++调用MATLAB程序方法
- MATLAB打包生成DLL动态链接库
- VS2017环境配置
- 程序调用
- 常见问题解决
- 参考
C++调用MATLAB程序方法
编译器版本:VS2017和MATLAB2019a(均为64位)
MATLAB打包生成DLL动态链接库
第一步: 在MATLAB命令行窗口中输入mex -setup,会出现如下界面。
第二步: 点击界面中的mex -setup C++,出现提示配置VS编译器版本,这里是VS2017。
第三步: 对MATLAB中的函数进行编译,主要为了生成动态库等文件。
命令行输入命令:mcc -W cpplib: myadd -T link:lib myadd.m -C
其中红色字体标出部分为生成动态库名称和matlab中自定义函数名称。
输入命令后需要等待几分钟进行编译。生成文件如下:
主要文件包括:.dll文件,.h文件,.lib文件和.ctf文件
至此,在MATLAB平台下进行编译生成库文件的操作就完成了。接下来进行VS2017平台环境配置。
VS2017环境配置
第一步: 在VS中添加MATLAB安装目录下的extern中include文件夹。具体操作为:在VS中右键项目,点击属性,在属性中选择“配置属性”->“VC++目录”->“包含目录”。
示例路径:D:\MATLAB2019\matlab2019\extern\include
第二步: 在VS中添加需要的lib文件。具体操作为:在VS中右键项目,点击属性,在属性中选择“配置属性”->“VC++目录”->“库目录”。
示例路径:D:\MATLAB2019\matlab2019\extern\lib\win64\microsoft
第三步: 因为D:\Program Files (x86)\MATLAB 2017a\extern\lib\win64\microsoft这个路径中包含了MATLAB中的数据类型和一些函数的定义文件,如" mclmcrrt.lib"文件等。接下来就是加载lib文件了,lib文件的加载有两种方法:动态加载和静态加载。【本质没有区别,取决于使用习惯】
动态加载: 是指在项目属性的附加依赖项中进行lib的相关操作,使程序能正确加载lib文件。在属性中选择“配置属性”->“链接器”->“附加依赖项”,在其中添加:
libeng.lib
libmat.lib
libmex.lib
libmx.lib
mclmcrrt.lib
mclmcr.lib
myadd.lib(最后这一个是自己生成的那个lib文件)
静态加载: 是只需要在程序中调用lib文件即可,调用方式如下:
#pragma comment(lib,"myadd.lib")//自己生成的lib文件
#pragma comment(lib,"libeng.lib")
#pragma comment(lib,"libmat.lib")
#pragma comment(lib,"libmex.lib")
#pragma comment(lib,"libmx.lib")
#pragma comment(lib,"mclmcrrt.lib")
#pragma comment(lib,"mclmcr.lib")
程序调用
程序调用需要注意一些数据类型的处理问题,主要是mwArray类,mwArray是在C++项目中调用MATLAB函数时使用的数据类型,无论传入参数,还是获取返回值,均使用这一种数据类型,可以看作为一种由MATLAB编译器识别的多维数组类型。
这里不做过多的描述,主要可以参考以下内容:
https://blog.csdn.net/yujiao12365/article/details/79533121
https://blog.csdn.net/qq_26464039/article/details/84305030?spm=1001.2014.3001.5501
主程序:
#include "myadd.h"
#include <iostream>
#include <fstream>
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"using namespace std;#pragma comment(lib,"myadd.lib")//自己生成的lib文件
#pragma comment(lib,"libeng.lib")
#pragma comment(lib,"libmat.lib")
#pragma comment(lib,"libmex.lib")
#pragma comment(lib,"libmx.lib")
#pragma comment(lib,"mclmcrrt.lib")
#pragma comment(lib,"mclmcr.lib")int main()
{myaddInitialize();//初始化函数//if (!myaddInitialize()) // 修改为你自己的工程---进行初始化//{// cout << "Could not initialize myadd!" << endl;// exit(0);//}mwArray x(1, 1, mxDOUBLE_CLASS);mwArray y(1, 1, mxDOUBLE_CLASS);x(1, 1) = 20;y(1, 1) = 30;mwArray a(1, 1, mxDOUBLE_CLASS);mwArray b(1, 1, mxDOUBLE_CLASS);myadd(2, a, b, x, y);//修改为你自己的工程---2是返回值的个数,后面跟的a,b存储了返回值,再往后的就是m函数传入的参数cout << "a = " << a << " b = " << b << endl;myaddTerminate();system("pause");return 0;
}
MATLAB函数:
成功运行结果:
常见问题解决
问题1:0x0000000000000000 处有未经处理的异常(在 test2.exe 中): 0xC0000005: 执行位置 0x0000000000000000 时发生访问冲突。
这是由于没有对调用的MATLAB函数进行初始化引起的错误,需要在调用MATLAB函数之前进行初始化,在调用结束后由进行关闭。
myaddInitialize();//初始化函数
myaddTerminate();
问题2:0x00007FFEE87C4ED9 处(位于 test2.exe 中)有未经处理的异常: Microsoft C++ 异常: mwException,位于内存位置 0x00000009137EF300 处。
这是由于VS工程文件下缺少.ctf文件引发的错误。只需要将生成的.ctf文件添加到工程文件目录即可。
问题3:版本对应问题
MATLAB与VS需要进行版本对应,这里没有明确指出新老版本的对应关系,因为我的测试是使用MATLAB2019a和VS2017完成的【经测试在VS2013下也可以正常调用】。这里指出的对应是说MATLAB和VS需要同是32位或者64位。
可以在VS下面配置管理器进行选择,以确保版本匹配。
参考
https://bbs.csdn.net/topics/340106981/
https://blog.csdn.net/weixin_40710375/article/details/87714132
https://blog.csdn.net/qq_26464039/article/details/84305030?spm=1001.2014.3001.5501
https://www.freesion.com/article/84861214838/
书籍:《精通MATLAB与C/C++混合程序设计》
https://pan.baidu.com/s/1xtT7puqoEAoCvEwv83gfmg
提取码:4ku7
C++调用MATLAB程序进行混合编程以及常见问题解决相关推荐
- 在matlab中 编程n,Matlab与C++混合编程 1--在C++中调用自己写的matlab函数
在Visual Studio中使用C++中调用MATLAB程序 在matlab中可以通过mbuild工具将.m文件编译成dll文件供外部的C++程序调用,这样就可以实现matlab和C++混合编程的目 ...
- linux下java调用matlab程序,linux_java调用windows_matlab程序
0 说明 本文为研究java和matlab的混合编程,进行了详细的测试和探索,以解决linux环境下java程序调用matlab程序的一个应用. linux端的环境 :(运行java程序并调用wind ...
- matlab与vs混合编程,matlab与vs混合编程/matlab移植
前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部 ...
- matlab 与VS混合编程的几个问题
matlab 与VS混合编程的几个问题 根据前一段的时间matlab与VS程序数据互传的程序调试,总结一下编译调试过程中可通遇到的几个问题及处理方法. 1.环境与资源配置 本人用的是matlab201 ...
- MATLAB 部署工具(Deployment Tool)的使用——MATLAB与C#混合编程
MATLAB 部署工具(Deployment Tool)的使用 MATLAB与C#混合编程 对于许多开发者而言,借助MATLAB提供的丰富的矩阵运算,实现需求算法,相比于纯手工实现底层算法具有较高的效 ...
- Matlab和C#混合编程
Matlab和C#混合编程 Matlab生成dll文件 C#使用dll 工作中有一些老算法在matlab中实现,新项目需要用C#来做,只能用matlab和C#混合编程,在matlab下把老算法编译成d ...
- 基于MATLAB与VC混合编程的数字均衡器设计
1.概述 随着数字化技术的快速.深入发展,人们对数字化电子产品所产生的图像.图形以及声音等质量的要求越来越高.在实时数字处理过程中,与D/A和A/D转换相关的模拟信号重构过程是决定数字系统输出质量的关 ...
- vb.net 调用matlab程序 绘图,vbnet调用matlab
\\然后参考该 类库的文档,在类里引用 matlab 的命名空间 装 matlab ,添加引用[VB.Net] Matlab = CreateObject("matlab.applicati ...
- Matlab与C++混合编程(依赖OpenCV)
opencv 2.4.6 和VS2008和matlab混合编程配置_YanhaoZhang_新浪博客 http://blog.sina.com.cn/s/blog_4a1853330102vg2r.h ...
最新文章
- 自然语言(NLP)发展史及相关体系
- Java多线程3:Thread中的静态方法
- python计算平方用map函数_python的map函数的使用方法详解以及使用案例(处理每个元素的自增、自减、平方等)...
- boost::multi_index模块相关的测试程序
- 计算机调剂到材料科学与工程,2019年郑州大学材料科学与工程专业考研调剂信息...
- C# list导出Excel(二)
- 转-Android之PreferenceActivity
- 向SourceView增加垂直行号标注
- Mac使用OpenCV项目步骤
- wiki.openwrt.org无法打开的解决办法
- 如何让员工适应CRM客户管理系统
- 携程数据分析笔试第一题
- foo, bar, 甲乙丙丁
- Google设置应用专用密码
- android 绑定布局,android – 在数据绑定中设置动态布局高度
- 片上网络之路由器微结构
- PHPSTORM取消提示变量的黄色下滑波浪线
- 她的梦想是买一台新的计算机的英语,关于梦想的英语作文(精选11篇)
- vu3响应式原理 代码分析
- 基于8086单片机的PWM调光(带汇编)