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,只需要初始化一个呢,于是乎 测试了一下 初始化第一个函数 调用第二个函数 呃呃呃 程序崩溃了!

算了 看来同时只能调用一个(这个只是临时这么认为,相信一定有解决办法的,只是现在没有找到而已)。