關(guān)鍵字
Remember to call vcvarsall.bat to complete environment setup!
Warning: Cannot find Visual Studio installation directory, VCINSTALLDIR is not set.
Qt 找不到 msvcp140.dll, msvcp140d.dll, vcruntime140.dll, vcruntime140d.dll, ucrtbased.dll
問(wèn)題分析
當(dāng)你用MSVC編譯器編寫(xiě)的程序,在使用Qt的打包工具windeployqt.exe時(shí),在終端第二行會(huì)看到 “Remember to call vcvarsall.bat to complete environment setup!” 字符串;在打包過(guò)程中還會(huì)遇到 “Warning: Cannot find Visual Studio installation directory, VCINSTALLDIR is not set.”
大部分人可能沒(méi)在意,也覺(jué)得無(wú)關(guān)緊要。但是,在你的電腦上沒(méi)問(wèn)題,并不代表別人的電腦就正常。比如在運(yùn)行程序時(shí)會(huì)遇到找不到 VCRUNTIME140_1.dll ,找不到msvcp140.dll ,ucrtbased.dll等等VC庫(kù)情況。
MSVC編譯器編寫(xiě)的程序就會(huì)遇到以上VC運(yùn)行庫(kù)缺失的問(wèn)題。
也就是說(shuō),在打包的過(guò)程中,只是把Qt的相關(guān)動(dòng)態(tài)庫(kù)部署好了,但是VS (或者VC)的運(yùn)行環(huán)境并沒(méi)有部署。
所以為了杜絕隱患,應(yīng)該重視這兩個(gè)警告。那么如何解決呢
解決方案
目前探索了很多種解決方案,供大家參考。至于,手動(dòng)拷貝缺失的動(dòng)態(tài)庫(kù)也可以解決問(wèn)題,但不夠優(yōu)雅,或者太low。
方案一
這種方法最省事,一次設(shè)置,后續(xù)都能用。解決方案就是添加一個(gè)VS的環(huán)境變量。
首先,找到VS的安裝目錄,比如我的是默認(rèn)安裝在C盤(pán)。復(fù)制路徑C:\Program Files\Microsoft Visual Studio\2022\Community\VC
打開(kāi)環(huán)境變量,添加一個(gè)系統(tǒng)變量,變量名為VCINSTALLDIR
,變量值為C:\Program Files\Microsoft Visual Studio\2022\Community\VC
然后重新打開(kāi)Qt的命令行,執(zhí)行
windeployqt E:\Code\CppProject\QtWidgetsApplication1\x64\QtWidgetsApplication1.exe
可以看到,這下沒(méi)有Warning: Cannot find Visual Studio installation directory, VCINSTALLDIR is not set.
警告了,同時(shí),輸出里增加了一些VC的動(dòng)態(tài)庫(kù)。這就說(shuō)明,我們打包的同時(shí),已經(jīng)把VC的環(huán)境帶上了。
方案二
不想加入環(huán)境變量怎么辦,也可以做到。但稍微有點(diǎn)繁瑣。
首先搜索一下 vcvarsall.bat
的路徑,我的路徑是C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\Build\vcvarsall.bat
然后,打開(kāi)Qt的命令行配置環(huán)境,輸入
call "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/Build/vcvarsall.bat"
可以看到報(bào)錯(cuò)了,原因是我們沒(méi)選擇對(duì)應(yīng)x86,x64位數(shù)。在尾部根據(jù)自己編譯的位數(shù)加上即可:
call "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/Build/vcvarsall.bat" x64
這時(shí),就顯示已經(jīng)初始化的x64的環(huán)境。
然后再執(zhí)行打包命令即可,可以看到跟方案一結(jié)果一致。
方案三
還可以使用VS的命令行進(jìn)行打包,打開(kāi)VS的命令行會(huì)自動(dòng)配置好VS的環(huán)境,就不需要我們手動(dòng)配置了。然后調(diào)用windeployqt.exe去打包就行了。
根據(jù)版本去打開(kāi)對(duì)應(yīng)的VS命令行,比如我這里編寫(xiě)的程序是x64位,那我就打開(kāi)x64 Native Tools Command Prompt
可以看到,已經(jīng)自動(dòng)設(shè)置好了VS x64的環(huán)境。那么接下來(lái)調(diào)用對(duì)應(yīng)版本的windeployqt程序進(jìn)行打包。
D:\Qt\5.15.2\msvc2019_64\bin\windeployqt.exe E:\Code\CppProject\QtWidgetsApplication1\x64\QtWidgetsApplication1.exe
方案四
最后一個(gè)辦法,那就是自己不處理,交給用戶處理。如果遇到這個(gè)問(wèn)題,就安裝vc運(yùn)行庫(kù),下載對(duì)應(yīng)版本安裝即可。
Microsoft C 和 C++ (MSVC) 運(yùn)行時(shí)庫(kù)下載地址:
https://docs.microsoft.com/zh-cn/cpp/windows/latest-supported-vc-redist?view=msvc-170
問(wèn)題
可能有些人按照此方法打包出來(lái),只有一個(gè)vc_redist64.exe,沒(méi)有對(duì)應(yīng)的動(dòng)態(tài)庫(kù)。
原因可能有 Qt 版本的不同導(dǎo)致差異性。另外,使用MinGW編譯器。本文的前提是 MSVC 編譯器
如果按照上述方法,你還是無(wú)法得到對(duì)應(yīng)的動(dòng)態(tài)庫(kù),可加 --compiler-runtime
參數(shù)進(jìn)行嘗試。
即:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-436795.html
D:\Qt\5.15.2\msvc2019_64\bin\windeployqt.exe --compiler-runtime E:\Code\CppProject\QtWidgetsApplication1\x64\QtWidgetsApplication1.exe
總結(jié)
以上就是我總結(jié)的四種解決方案,都可以解決VC運(yùn)行環(huán)境的問(wèn)題。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-436795.html
到了這里,關(guān)于Qt 打包發(fā)布程序,解決找不到msvcp140.dll等動(dòng)態(tài)庫(kù)問(wèn)題正確方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!