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程序进行混合编程以及常见问题解决相关推荐

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

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

  2. linux下java调用matlab程序,linux_java调用windows_matlab程序

    0 说明 本文为研究java和matlab的混合编程,进行了详细的测试和探索,以解决linux环境下java程序调用matlab程序的一个应用. linux端的环境 :(运行java程序并调用wind ...

  3. matlab与vs混合编程,matlab与vs混合编程/matlab移植

    前言 项目算法中包含了不同编译工具的代码,分别是matlab和VS,需要将二者结合起来,统一在同一个系统工作,此时就要用到matlab和vs混合编程. 在matlab中将.m文件编译生成库文件等供外部 ...

  4. matlab 与VS混合编程的几个问题

    matlab 与VS混合编程的几个问题 根据前一段的时间matlab与VS程序数据互传的程序调试,总结一下编译调试过程中可通遇到的几个问题及处理方法. 1.环境与资源配置 本人用的是matlab201 ...

  5. MATLAB 部署工具(Deployment Tool)的使用——MATLAB与C#混合编程

    MATLAB 部署工具(Deployment Tool)的使用 MATLAB与C#混合编程 对于许多开发者而言,借助MATLAB提供的丰富的矩阵运算,实现需求算法,相比于纯手工实现底层算法具有较高的效 ...

  6. Matlab和C#混合编程

    Matlab和C#混合编程 Matlab生成dll文件 C#使用dll 工作中有一些老算法在matlab中实现,新项目需要用C#来做,只能用matlab和C#混合编程,在matlab下把老算法编译成d ...

  7. 基于MATLAB与VC混合编程的数字均衡器设计

    1.概述 随着数字化技术的快速.深入发展,人们对数字化电子产品所产生的图像.图形以及声音等质量的要求越来越高.在实时数字处理过程中,与D/A和A/D转换相关的模拟信号重构过程是决定数字系统输出质量的关 ...

  8. vb.net 调用matlab程序 绘图,vbnet调用matlab

    \\然后参考该 类库的文档,在类里引用 matlab 的命名空间 装 matlab ,添加引用[VB.Net] Matlab = CreateObject("matlab.applicati ...

  9. Matlab与C++混合编程(依赖OpenCV)

    opencv 2.4.6 和VS2008和matlab混合编程配置_YanhaoZhang_新浪博客 http://blog.sina.com.cn/s/blog_4a1853330102vg2r.h ...

最新文章

  1. 自然语言(NLP)发展史及相关体系
  2. Java多线程3:Thread中的静态方法
  3. python计算平方用map函数_python的map函数的使用方法详解以及使用案例(处理每个元素的自增、自减、平方等)...
  4. boost::multi_index模块相关的测试程序
  5. 计算机调剂到材料科学与工程,2019年郑州大学材料科学与工程专业考研调剂信息...
  6. C# list导出Excel(二)
  7. 转-Android之PreferenceActivity
  8. 向SourceView增加垂直行号标注
  9. Mac使用OpenCV项目步骤
  10. wiki.openwrt.org无法打开的解决办法
  11. 如何让员工适应CRM客户管理系统
  12. 携程数据分析笔试第一题
  13. foo, bar, 甲乙丙丁
  14. Google设置应用专用密码
  15. android 绑定布局,android – 在数据绑定中设置动态布局高度
  16. 片上网络之路由器微结构
  17. PHPSTORM取消提示变量的黄色下滑波浪线
  18. 她的梦想是买一台新的计算机的英语,关于梦想的英语作文(精选11篇)
  19. vu3响应式原理 代码分析
  20. 基于8086单片机的PWM调光(带汇编)

热门文章

  1. 【Linux】日志管理及日志轮询
  2. 服务器系统重装后anaconda3安装以及环境配置
  3. 达芬奇在AMD处理器的联想电脑上编辑视频时花屏、卡帧、闪烁的解决方法
  4. 如何计算地球上两点的距离(附公式推导)
  5. Maven的安装和介绍
  6. 如何将一节课转成文字文稿
  7. One Piece 海贼王动漫壁纸 Python 爬取!
  8. JustNews主题
  9. 北京交通广播对话雷建平:揭秘中概股上市背后故事
  10. word绘制柱状图显示少一列数据-解决办法