Matlab 2017b编译生成exe或DLL文件后无法运行的问题及其解决方法

问题描述

最近尝试用Matlab 2017b和Qt 5.9混合编程。用Matlab编写了一个很简单的m文件,配置使用Visual C++ 2015 编译器,用deploytool和对m文件进行编译,编译后能生成exe文件。所有的环境变量等设置的也没有问题,但是运行编译后的程序时就会出现问题,DOS窗口闪现后就关闭了。

在DOS窗口下执行编译后的exe文件,有如下的错误信息:

Fatal Internal Error:std::exception: Bundle#4 start failed: Loading D:\MATLAB2017b\bin\win64\matlab_startup_plugins\lmgrimpl\libmwlmgrimpl.dllfailed with error:    "

问题应该是 libmwlmgrimpl.dll 运行失败。网上搜索发现这个文件是与License有关的,但是我用的是正版的Matlab 2017b,连接官网后激活的,应该不是License的问题。

搜索查看了很多网上的资料,大多是描述环境变量设置、编译器设置等问题的,尝试了各种设置,折腾了一天的时间,最后才在Matlab Answers里搜到了此问题的描述及解决方法。参考下面的连接:

Compiled application doesnot run because of startup plugin libmwlmgrimpl.dll

https://cn.mathworks.com/matlabcentral/answers/373411-compiled-application-does-not-run-because-of-startup-plugin-libmwlmgrimpl-dll


这个是Matlab 2017b里面才出现的一个比较奇怪的问题,可能是因为Matlab 2017b版本比较新,遇到此问题的人还不多,所以没有中文的页面介绍此问题。

回答这个问题的是MATLAB的官方人员,一般人可能很难找出原因和解决办法。为了避免同学们掉进这个坑花费太多的时间,所以我把这个问题的资料翻译并整理出来。


问题原因

出现此问题是由于Windows 的system32目录下两个DLL文件版本太低,这两个文件是SSLEAY32.DLL和LIBEAY32.DLL。

这两个文件在MATLAB安装目录的\bin\win64目录下也有,\bin\win64这个目录是在添加到了系统的PATH变量里了的。但是Matlab编译后的exe程序在运行时,system32目录有高的优先级,会使用system32目录下的这两个文件,导致初始化错误,直接闪退。

解决方法

知道了此原因,有两种解决方法:

(1)将Matlab的安装目录 \bin\win64下的SSLEAY32.DLL和LIBEAY32.DLL复制到windows的system32目录下,覆盖旧版本的文件。但是这样可能导致使用这两个DLL文件的其他程序出现问题。

(2)将Matlab的安装目录 \bin\win64下的SSLEAY32.DLL和LIBEAY32.DLL文件复制到自己编译后的exe同目录下,这样exe文件在运行时就是找自己目录下的这两个DLL文件,而不会使用windows\system32目录下的DLL文件。


测试效果

为了便于查看程序运行效果,编写了一个简单的绘制sin曲线的函数,没有输入输出参数。

function   drawsin()
% 绘制sin曲线,无输入输出参数
t=0:0.1:15;
y=sin(t);
plot(t,y);
end

在Matlab 命令窗口里通过下面的配置,设置使用Visual C++ 2015编译器

>> mbuild -setup C++
 MBUILD 配置为使用 'Microsoft Visual C++ 2015' 以进行 C++ 语言编译。
在Matlab 命令行里通过deploytool打开Matlab Compiler,选择生成Standalone Application,添加drawsin.m文件后打包编译。

编译成功后的drawsin\for_testing目录下是生成的drawsin.exe文件,将Matlab安装目录\bin\win64目录下的SSLEAY32.DLL和LIBEAY32.DLL文件复制到此目录下。

双击drawsin.exe文件,就可以正常运行了,结果如下图。

P.S.

使用MATLAB2017b编译生成DLL文件,在Qt 5.9里编写程序调用生成的DLL文件,在没有任何其他错误的情况下也出现此问题。所以,也需要将SSLEAY32.DLL和LIBEAY32.DLL复制到Qt编译生成的exe文件目录下。





展开阅读全文

没有更多推荐了,返回首页