我們的工程馬上就要發(fā)布,但是在一個干凈的,即沒有安裝vs2005的xp上運行(利用虛擬機測試)卻彈出下面得錯誤
“由于應(yīng)用程序配置不正確,應(yīng)用程序未能啟動。重新安裝應(yīng)用程序可能會糾正這個問題“
在英文os上:
This application has failed to start because the application
configuration is incorrect. Reinstalling the application may fix
this problem.
考慮到程序的運行環(huán)境問題,可能是由于沒有安裝.netFrameWork.但是后來安裝上之后仍然如故。郁悶。。。
在網(wǎng)上找出了這些方法:
方法一:
在類似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
把這幾個文件拷貝到目標(biāo)機器上,與運行程序同一文件夾或放到system32下,就可以正確運行了。
其他release版、MFC程序什么的都是拷redist下相應(yīng)文件夾下的文件就可以了,文件夾后都有標(biāo)識!
方法二:
修改編譯選項,將/MD或/MDd 改為
/MT或/MTd,這樣就實現(xiàn)了對VC運行時庫的靜態(tài)鏈接,在運行時就不再需要VC的dll了。
注:MSDN中對于在不同的配置下Link的LIB作了說明:
C Runtime Library:
開關(guān) 對應(yīng)的庫 版本
/MD MSVCRT.LIB 多線程DLL的Release版本
/MDd MSVCRTD.LIB 多線程DLL的Debug版本
/MT LIBCMT.LIB 多線程靜態(tài)鏈接的Release版本
/MTd LIBCMTD.LIB 多線程靜態(tài)鏈接的Debug版本
/clr MSVCMRT.LIB 托管代碼和非托管代碼混合
/clr:pure MSVCURT.LIB 純托管代碼
C++ Standard Library:
開關(guān) 對應(yīng)的庫 版本
/MD MSVCPRT.LIB 多線程DLL的Release版本
/MDd MSVCPRTD.LIB 多線程DLL的Debug版本
/MT LIBCPMT.LIB 多線程靜態(tài)鏈接的Release版本
/MTd LIBCPMTD.LIB 多線程靜態(tài)鏈接的Debug版本
編譯器會自動根據(jù)編譯選項,選擇對應(yīng)的LIB文件。一般情況下這不會出現(xiàn)問題。
然而,在部分情況下,一旦你的程序的各個部分(LIB,
OBJ…)并非由相同的編譯選項編譯出,而Link在一起的話,會出現(xiàn)各種各樣的看似很難解決的問題,這類問題主要以重復(fù)定義的錯誤形式存在,通常的解決方法也很簡單,就是選擇同樣的編譯選項進(jìn)行編譯之后再Link
方法三:
工程-》屬性-》配置屬性-》常規(guī)-》MFC的使用,選擇“在靜態(tài)庫中使用mfc”
這樣生成的exe文件應(yīng)該就可以在其他機器上跑了。
方法四:
安裝vcredist_x86.exe
這樣四步下來,大部分程序都應(yīng)該可以運行了,但悲哀的是在我的測試機上還是報應(yīng)用程序配置錯誤。無奈。。
后打開vs2005的命令行,運行depends.exe,試圖找出程序啟動所依賴的dll,結(jié)果大失所望,虛擬機上這些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