VS/Qt C++和Matlab混合编程
2018-09-18 06:24:33来源:博客园 阅读 ()
最近两天在搞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,只需要初始化一个呢,于是乎 测试了一下 初始化第一个函数 调用第二个函数 呃呃呃 程序崩溃了!
算了 看来同时只能调用一个(这个只是临时这么认为,相信一定有解决办法的,只是现在没有找到而已)。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash