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

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

  

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!