VS/Qt C++和Matlab混合编程
最近两天在搞C++和Matlab混合编程,这个中间过程真是让人心酸啊,最后还是搞定成功!现在把这个过程记录一下。
首先自己的电脑本来就安装着matlab2013b,按着网上的说法首先需要输入!mcc,测试当前matlab上的编译器。可是发现没有,上网查资料说是matlab2013b破解不完全。没办法从网上下载了matlab2015a,然后安装破解。测试发现编译器OK
然后写了一个add.m文件,生成动态库dll。然后在vs2013中调用,出现无法解析的外部符号。然后用工具查看了一下dll中导出的符号。只有自己定义的那个函数符号符合正常的规则,其他的函数导出符号看起来很奇怪,和函数本身名一样。最后继续在网上查找
各种方法,后来说是软件位数不同导致的。VS2013默认的版本是win32 32位的。而matlab导出的dll,是64位的,所以修改工程为64位工程。另外就是配置各种matla需要的头文件路径和lib路径。然后顺利编译通过。运行程序时让人崩溃了 出现应用程序无法启动 0x000007b,然后查找网上各种说法,程序调用的dll不对,要修复系统dll,然后自己还下载了修改工具,把系统修复了一遍,但是还是没有解决问题。搞了一天半,人都快崩溃了 问题还是没有解决。无奈猜想是不是系统有什么问题,然后把运行程序复制到win10系统下运行经过一番copy 需要的dll之后 点击exe 还是报同样的错误。无奈啊。。。。
算了 不搞了 又去求助python,查阅了一些python和matlab的对比介绍。还是觉得matlab更符合自己的需要。没办法 还得搞这个问题。最后算了 先搞其他事,先让自己缓一缓。
过了一天,自己心里还是老惦记着这个事。心想是不是还是matlab的问题,于是乎又去网上看别人成功的例子用的是哪个版本。然后看到有人用matlab2016a和vs2013的案例。然后又去网上找matlab2016a的安装包。然后同样的方法安装,破解,导出dll,vs调用 编译。。最后运行。 心里那个苦啊 还是报那个错误。上天呀 问题出在哪呢!!!!!!!!
最后准备放弃的时候,突然脑子闪过之前看过说matlab和C++混合编程头文件重复包含导致重定义。的确工程编译的有一些宏重复定义的警告。后来把包含的三个头文件去掉,发现照样可以编译过,包含多余的。然后去点击exe,竟然运行成功了!成功了!竟然一个小小的告警隐藏着这么大的隐患。
具体根本原因是怎么导致崩溃的,其实自己还是没有搞清楚。
因为自己用Qt比较熟练,所以开始考虑在Qt中调用matlab生成的dll,其实原理都一样很简单。
在pro中配置好lib库以及需要的头文件,编译通过OK,运行的时候出现初始化失败!郁闷。想了好久也想不出原因。后来过了一天。翻阅网上的帖子突然考到vs编译器版本问题。突然意识到有可能是编译器版本的问题。
首先说一下自己电脑上的各种版本:自己电脑上首先matlab版本有2013b 2015b,2016a这几个版本 vs2010 vs2013 Qt5.5.1-vs2013(32位) Qt5.5.1-vs2010(32位和64位)
看着都乱~
生成dll我是用matlab2016a 选择的编译器是vs2013 C++,编译出来的dll 在vs2013 64位环境下运行ok的,但是在Qt5.5.1-2010(64)运行就出现初始化失败。仔细推敲发现。我的64位Qt是vs2010版本的,而生成matlab的dll是用vs2013 C++编译器生成的。版本不对应。
于是乎。。。将matlab的编译器选择成vs2010 C++版本 生成dll 然后在Qt运行,又出问题了出现。
报错:
An Error has occurred while trying to initialize the MATLAB Runtime.
The error is: Fatal error loading library D:\software\matlab2016a\bin\win64\libmat.dll Error: 找不到指定的程序。
这是什么鬼~ libmat.dll调用乱了吗(电脑中,matlab版本很多),那就找到对应的libmat.dll copy到运行目录下,继续运行 还是同样的错误。。郁闷啊
双击exe程序,出现无法定位程序输入点于icuuc54.dll,那就将这个dll拷贝到运行目录下 运行!哇塞 成功了!竟然运行出来。
不过好像有个警告
SetThrowSegvLongjmpSEHFilter(): filter function installed
SetThrowSegvLongjmpSEHFilter(): filter function installed
出现了上面两行东东~
什么原因呢。。。没有搞懂。
至此 也就是matab和vs Qt混合编程算是成功了 谁知后面正式用的时候还会出现什么问题。
后续如有新的发现。会继续跟踪的!
使用又发现了问题,同时调用两个matlab导出的dll,会出现第二个函数初始化失败。
怎么办呢?尝试发现 屏蔽第一个函数的初始化,只初始化第二函数,然后就可以通过了。
我就想。是不是调用多个dll,只需要初始化一个呢,于是乎 测试了一下 初始化第一个函数 调用第二个函数 呃呃呃 程序崩溃了!
算了 看来同时只能调用一个(这个只是临时这么认为,相信一定有解决办法的,只是现在没有找到而已)。
VS/Qt C++和Matlab混合编程的更多相关文章
- C++和MATLAB混合编程-DLL
先小话一下DLL,DLL是动态链接库,是源代码编译后的二进制库文件和程序接口,和静态链接库不同的是,程序在编译时并不链接动态链接库的执行体,而是在文件中保留一个调用标记,在程序运行时才将动态链接库文件 ...
- java matlab混合编程之返回值Struct类型
java matlab混合编程的时候当返回值是Struct类型(matlab中的返回类型)如何来取得(java中)其值? 上网找,看到这个网页:http://www.mathworks.cn/cn/h ...
- WPF(C#)与MATLAB混合编程
WPF(C#)与MATLAB混合编程 WPF可以为开发者提供便捷地构建用户交互界面的解决方法,而matlab则在科学计算方面有着无与伦比的优势,因此在一些需要将科学算法转换为应用软件的项目中,需要应用 ...
- VC 与Matlab混合编程之引擎操作详解
Visual C++ 是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快.但在科学计算方面函数库显得不够丰富.读取.显示数据图形不方便. Matlab 是一款将数值分析.矩阵计算.信 ...
- C++和MATLAB混合编程求解多项式系数(矩阵相除)
摘要:MATLAB对于矩阵处理是非常高效的,而C++对于矩阵操作是非常麻烦的,因而可以采用C++与MATLAB混合编程求解矩阵问题. 主要思路就是,在MATLAB中编写函数脚本并使用C++编译为dll ...
- matlab混合编程向导(vc,vb,.net...)
一.matlab与vc混编 1.通过mcc将matlab的m文件转化为cpp,c文件或dll供vc调用: 这方面的实现推荐精华区Zosco和ljw总结的方法(x-6-1-4-3-1和2) ...
- Matlab混合编程
Matlab混合编程 混合编程目的 在Matlab中采用混合编程目的主要包括 利用已有的函数库,避免重复工作 加速计算,特别是减少循环所用时间 利用GPU等进行异构编程 混合编程方法-mex函数 目前 ...
- C#Matlab混合编程类 初始化问题解决方法
************** 异常文本 ************** System.TypeInitializationException: “myPlus.matClass”的类型初始值设定项引发异 ...
- 国内第一部C#.Net调用Matlab混合编程视频教程
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 Matlab和C#混合编程文章目录:[目录]Matlab和C#混合编程文章目录 一.视频说明 2014年的5.1,我将这套视频教 ...
随机推荐
- Java IO 输入和输出流
数据流是指一组有顺序的,有起点和终点的字节集合. 最初的版本中,java.io 包中的流只有普通的字节流,即以 byte 为基本处理单位的流.字节流用来读写 8 位的数据,由于不会对数据做任何转换,因 ...
- 从各处收集的switch语句
重构之重复代码: 1.(重复代码是)语义一致的逻辑 反例:语义一致的逻辑产生了多个实体 缺点:如果你为语义一致的逻辑产生了多个实体,那么当需要修改这个逻辑时,你必须保证同时修改所有的实体,并确保它们是 ...
- shell学习(8)- ulimit调优系统参数
ulimit:显示(或设置)用户可以使用的资源的限制(limit),这限制分为软限制(当前限制)和硬限制(上限),其中硬限制是软限制的上限值,应用程序在运行过程中使用的系统资源不超过相应的软限制,任何 ...
- JS高级学习历程-4
4 执行环境可以访问什么变量 具体可以访问变量类型:局部变量.参数.函数.外部环境变量 优先级:局部变量 > 函数 > 参数 > 外部环境变量 <!DOCTYPE html&g ...
- 测试REST Web服务
EST Web服务的测试计划 线程组 HTTP请求 与任何Jmeter测试一样,我们首先需要创建一个线程组以及一个HTTP请求采样器. 如果您现在运行测试,则可能会收到错误,响应代码为415,响应消息 ...
- Js $.merge() 函数(合并两个数组内容到第一个数组)
定义和用法 $.merge() 函数用于合并两个数组内容到第一个数组. 语法 $.merge( first, second ) 参数 描述 first Array类型 第一个用于合并的数组,合并后 ...
- Django框架之MVT(1)
Django框架之MVT 灌输: 什么是根目录:就是没有路径,只有域名. url(r”^$”) 一. MVT模型 Django的MVT模型 - Model(模板):和数据库相关,负责 ...
- BZOJ 1433 && Luogu P2055 [ZJOI2009]假期的宿舍 匈牙利算法
刚学了匈牙利正好练练手(我不会说一开始我写错了)(怕不是寒假就讲了可是我不会) 把人看做左部点,床看作右部点 建图:(!!在校相当于有床,不在校相当于没有床 但是要来学校) 1.在校的 不走的人 自己 ...
- 《移动Web前端高效开发实战》笔记3--代码检查任务
在项目的开发过程中,统一的代码风格对于项目的可协作性以及可维护性来说相当重要,因此可以采用一些插件来进行代码风格的检查. 本例中的源文件包含两类:Sass文件和采用ECMAScript 6规范的Jav ...
- 行框基线位置确定(line box 基线)
在设置vertical-align属性(只有inline元素有效,对inline-block和block元素无效)时有一个属性值:baseline,那么这个基线是什么,怎么确定. 这个基线就是其所在行 ...