“應用程式配置不正確,應用程式未能啟動” 錯誤的解決
一、問題描述
今天在虛擬機器上裝了XP系統,但執行一個win32 Console程式時彈出對話方塊:
“由於應用程式配置不正確,應用程式未能啟動。重新安裝應用程式可能會糾正這個問題”
在英文os上:
This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem.
考慮到程式的執行環境問題,可能是由於沒有安裝.netFrameWork.但是後來安裝上之後仍然如故。鬱悶。。。
二、解決方法
在網上找出了這些方法:
方法一:
在類似C:\Program Files\Microsoft Visual Studio 8\VC\redi
st\Debug_NonRedist\x86\Microsoft.VC80.DebugCRT 下找到了下列檔案:
msvcm80d.dll
msvcp80d.dll
msvcr80d.dll
Microsoft.VC80.DebugCRT.manifest
把這幾個檔案拷貝到目標機器上,與執行程式同一資料夾或放到system32下,就可以正確運行了。
其他release版、MFC程式什麼的都是拷redist下相應資料夾下的檔案就可以了,資料夾後都有標識!
方法二(驗證過是OK的):
修改編譯選項,將/MD或/MDd 改為 /MT或/MTd,這樣就實現了對VC執行時庫的靜態連結,在執行時就不再需要VC的dll了。
注:MSDN中對於在不同的配置下Link的LIB作了說明:
C Runtime Library:
開關 對應的庫 版本
/MD MSVCRT.LIB 多執行緒DLL的Release版本
/MDd MSVCRTD.LIB 多執行緒DLL的Debug版本
/MT LIBCMT.LIB 多執行緒靜態連結的Release版本
/MTd LIBCMTD.LIB 多執行緒靜態連結的Debug版本
/clr MSVCMRT.LIB 託管程式碼和非託管程式碼混合
/clr:pure MSVCURT.LIB 純託管程式碼
C++ Standard Library:
開關 對應的庫 版本
/MD MSVCPRT.LIB 多執行緒DLL的Release版本
/MDd MSVCPRTD.LIB 多執行緒DLL的Debug版本
/MT LIBCPMT.LIB 多執行緒靜態連結的Release版本
/MTd LIBCPMTD.LIB 多執行緒靜態連結的Debug版本
編譯器會自動根據編譯選項,選擇對應的LIB檔案。一般情況下這不會出現問題。
然而,在部分情況下,一旦你的程式的各個部分(LIB, OBJ…)並非由相同的編譯選項編譯出,而Link在一起的話,會出現各種各樣的看似很難解決的問題,這類問題主要以重複定義的錯誤形式存在,通常的解決方法也很簡單,就是選擇同樣的編譯選項進行編譯之後再Link
方法三:
工程-》屬性-》配置屬性-》常規-》MFC的使用,選擇“在靜態庫中使用mfc”
這樣生成的exe檔案應該就可以在其他機器上跑了。
方法四:
安裝vcredist_x86.exe
這樣四步下來,大部分程式都應該可以運行了,但悲哀的是在我的測試機上還是報應用程式配置錯誤。無奈。。
後開啟vs2005的命令列,執行depends.exe,試圖找出程式啟動所依賴的dll,結果大失所望,虛擬機器上這些dll都有。如此這般令人抓狂。
最後把vs2005安裝目錄下的所有.manifest檔案(可以搜尋 *.manifest得到)都考到程式目錄下,程式奇蹟般的可以執行。
然後實驗,刪掉冗餘的.manifest檔案,只需要5個就夠了。它們是Microsoft.VC80.ATL.manifest
Microsoft.VC80.CRT.manifest
Microsoft.VC80.DebugCRT.manifest
Microsoft.VC80.DebugMFC.manifest
Microsoft.VC80.MFC.manifest