1. 程式人生 > >Matlab 2017b編譯生成exe或DLL檔案後無法執行的問題及其解決方法

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


這個是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檔案目錄下。



相關推薦

Matlab 2017b編譯生成exeDLL檔案無法執行的問題及其解決方法

問題描述最近嘗試用Matlab 2017b和Qt 5.9混合程式設計。用Matlab編寫了一個很簡單的m檔案,配置使用Visual C++ 2015 編譯器,用deploytool和對m檔案進行編譯,編譯後能生成exe檔案。所有的環境變數等設定的也沒有問題,但是執行編譯後的程

VScode編譯C++,標頭檔案顯示not found的解決方法

一直用codeblocks,想試試vscode,結果這個問題給我弄懵逼了。一開始以為是iostream這個標頭檔案not found,後來發現第一個標頭檔案都會這樣顯示,放到後面就不會了,然而,光這一個顯示not found(雖然並不影響編譯),就能逼死強迫症的啊~~~ 言歸正傳,這個問題解

restorator 執行其他所有EXE檔案無法執行解決方案

昨天要反編譯一個EXE,用RESTORATOR來檢視資源羅列情況,倒黴的事情發生了,所有EXE檔案點右鍵後‘開啟’都沒有了,剛開始以為中度了,進安全模式看,發現檔案都沒有異常,並且在安全模式下問題照樣出現,大概明白應該是登錄檔的EXEFILE被篡改了,搞了N久都卡殼了,發現新建一個賬戶是沒有問題的,然後就試著

因以下檔案的損壞丟失,Windows無法啟動【解決方法

【現象描述】 【原因分析】 (1)由於某種原因(如正常關機)導致這個檔案損壞或丟失; (2)檔案本身沒有問題,但是機器讀取出錯。 【解決方法】 對於原因(1),解決方法可以按照故障時系統給出的提示,用Windows安裝盤進行修復,但是這種方式非常慢,而且現在大多數都是Gh

網遊“夢幻西遊”“my.exe”在Win7(XP)下出現“已停止工作”報錯無法執行解決方法

手動解決方法,管理員身份開啟 cmd,輸入 netsh winsock reset 並回車,重啟即可。 ------------------------------------------------

one-class svm_predict返回0無法執行解決方法(成功)

在使用svm中遇到的問題與解決,首先下面的程式碼是沒有實現的(但邏輯是沒有問題的,只是svm_predict不支援核2,3,4) String path = Environment.getExternalStorageDirectory().toString()+ Fi

pyinstaller打包exe--requests模組打包無法執行

歡迎加入學習交流QQ群:657341423 python程式中使用到requests,在開發環境中可以正常執行,但用pyinstaller 打包成單個exe檔案後,卻無法執行,提示 requests 中的urllib3依賴的一個six.py模組出現執行錯誤。以

用Mindjet MindManager 15 開啟檔案停止響應的解決方法

這個是因為檔案裡面有很多規格不統一的註釋(那個像小本子的圖示【裡面就是註釋部分】),預設編碼是utf-8的,如果不一樣的話就會出現這個問題。網上大多數都是讓咱們刪掉註釋再開啟 弱弱的問一下,如果我都把最詳細的註釋刪掉了,我還要打開個毛線? 逆天無意間摸索出一個解決方法:改改日期格式,騙騙軟體就o了~

從其他專案複製cs類檔案到新專案無法引用問題解決方法(開發環境vs2010,asp.net專案)

相信很多.net開發員都遇到過類似這樣的問題:之前開發過的專案中的部分類對現有專案又有,因此想把他們複製到新專案中來使用,以減少程式碼編寫量(當然,之前的程式如果能夠完全滿足新專案,可以直接生成dll,然後引入到新專案即可,這種情況就很好解決)。但當我們把這些cs檔案複製到

VS2010靜態編譯生成.exe執行檔案

VS2010靜態編譯生成的.exe可執行檔案,可以免安裝在其他電腦直接執行   靜態編譯:就是在編譯可執行檔案的時候,將可執行檔案需要呼叫的對應動態連結庫(.so)中的部分提取出來,連結到可執行檔案中去,使可執行檔案在執行的時候不依賴動態連結庫。     編譯方式: 第1種:

VS程式設計,x86,x64,Any CPU在可執行檔案(EXE)dll(動態連結庫)的區別:

Any CPU和x86的可執行檔案(EXE)或dll(動態連結庫)在32位和64位下的區別: 1、x86平臺編譯出來的exe(可執行檔案)或dll(動態連結庫)都是32位的 2、x64平臺編譯出來的exe(可執行檔案)或dll(動態連結庫)對應的則是64位的。 3、Any

使用VS的生成事件命令列指令將生成exedll檔案複製到指定資料夾中

VS預生成事件命令列 和 生成後事件命令列 巨集說明 $(ConfigurationName)            當前專案配置的名稱(例如,“Debug|Any CPU”)。 $(OutDir)                              輸出檔案目錄的路徑,相對於專案目錄。這解

VS2010靜態編譯生成.exe執行檔案,使c++程式脫離VS環境執行

VS2010靜態編譯生成的.exe可執行檔案,可以免安裝在其他電腦直接執行 靜態編譯:就是在編譯可執行檔案的時候,將可執行檔案需要呼叫的對應動態連結庫(.so)中的部分提取出來,連結到可執行檔案

Javac編譯生成.h標頭檔案

首先分兩種情況: 1、新建Java工程 ①編譯成.class檔案,重新整理工程編譯或者工程右鍵點選Build Project編譯。(在bin下生成.class檔案) ②在命令列cd 到bin目錄下,執行:javah -classpath . -jni com.android

java呼叫VC編譯而成的dll檔案

在JAVA中呼叫VC編寫的程式,JAVA提供一個本地方法,交給VC去實現,就是相當JAVA的介面與實現, 只不過中間的介面實現是VC實現的。 從而更好的實現了跨平臺的實用。 在Vc中建立一個空的dll工程,裡面什麼檔案也沒有,目的是Vc編譯生成的是DLL檔案,而不是EXE

word中MathPage.wllMathType.dll檔案找不到的解決方案(親測有效!)

在安裝了正版的mathtype 6.9b之後開啟word,竟然報了個mathpage.wll找不到的錯,於是乎逛了各大網站、部落格,一遍遍的試,不知道諸位是不是也和我一樣,屢次操作均是失敗。 但我的一次自行嘗試竟然解決了這個問題,其實解決的方法很簡單。因為由於版本的原因,網

VS2013中為C++程式生成lib和dll檔案

dll的優點 程式碼複用是提高軟體開發效率的重要途徑。只要某部分程式碼具有通用性,就可將它構造成相對獨立的功能模組並在之後的專案中重複使用。比較常見的例子是各種應用程式框架,ATL、MFC等,它們都

exedll檔案打包成單一的啟動檔案

music <iframe id="ShowSound" frameborder="0" scrolling="no" src=" http://www.kugou.com/song/azj6n09.html?frombaidu?frombaid

用VS自帶的dotfuscator.exeexedll進行簡單加密 以保護程式原始碼

程式編譯後 打包安裝前用VS自帶的dotfuscator.exe對編譯後的exe或dll進行簡單加密以起到一定保護作用一定程度上阻止VS自帶的ildasm.exe或其他反編譯工具如Reflector.exe等對程式原始碼的檢視保護自己的程式 1. ildasm.exe2.

labview中,用相對路徑動態呼叫的子VI,在生成EXE檔案無法呼叫問題的解決

給你舉例子吧。這樣容易懂。下面,我的主VI,是Welcome_gui.vi  我要動態呼叫執行choose.vi.注意我的檔案層次。   choose.vi在SUBVI資料夾下。  一定要把你呼叫到的資料夾和VI都放到專案檔案裡。最簡單方法,就只直接拖動檔案或者資料夾到專案裡。  如果你不拖動,後面的新增原檔