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編譯生成exe或DLL檔案後無法執行的問題及其解決方法
問題描述最近嘗試用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的生成事件命令列指令將生成的exe,dll檔案複製到指定資料夾中
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.wll或MathType.dll檔案找不到的解決方案(親測有效!)
在安裝了正版的mathtype 6.9b之後開啟word,竟然報了個mathpage.wll找不到的錯,於是乎逛了各大網站、部落格,一遍遍的試,不知道諸位是不是也和我一樣,屢次操作均是失敗。 但我的一次自行嘗試竟然解決了這個問題,其實解決的方法很簡單。因為由於版本的原因,網
VS2013中為C++程式生成lib和dll檔案
dll的優點 程式碼複用是提高軟體開發效率的重要途徑。只要某部分程式碼具有通用性,就可將它構造成相對獨立的功能模組並在之後的專案中重複使用。比較常見的例子是各種應用程式框架,ATL、MFC等,它們都
將exe和dll檔案打包成單一的啟動檔案
music <iframe id="ShowSound" frameborder="0" scrolling="no" src=" http://www.kugou.com/song/azj6n09.html?frombaidu?frombaid
用VS自帶的dotfuscator.exe對exe或dll進行簡單加密 以保護程式原始碼
程式編譯後 打包安裝前用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都放到專案檔案裡。最簡單方法,就只直接拖動檔案或者資料夾到專案裡。 如果你不拖動,後面的新增原檔