參考資料:
應用程式配置不正確,程式無法啟動 的解決方法資料收集
vc2005/vc2008採用了新的程式部署技術(manifest清單檔案),manifest清單檔案實際上類似於我們常用的makefile檔案,它定義了程式執行的依賴關係(程式執行所需要的dll庫的名稱、版本等)。
程式執行,首先根據manifest清單檔案(
這個檔案可以嵌入到exe或dll中,或者單獨生成外部檔案,可以通過vc2005/vc2008的編譯選項控制:工程「屬性」->「配置屬性」->「清單工具」->「輸入輸出」->「嵌入清單檔案」,選擇「是」或「否」來控制
)來查詢程式執行需要的dll庫的名稱、版本等,如果所在的系統中沒有程式執行所需要的dll庫和相應的manifest清單檔案,則彈出「
應用程式配置不正確,程式無法啟動」對話方塊。
另外要注意,由於vc2005/vc2008與.net整合,導致出現乙個新的概念:在.net中,將exe、dll都看成「程式集(assemble)」,每個程式集(assemble)都附帶有乙個manifest清單檔案,因此使得vc2005/vc2008的crt(c 執行時庫)、mfc、atl等dll庫都附帶有乙個manifest清單檔案。
歸根結底是由於老版本的系統沒有我們開發的程式執行所需要的基本執行時庫(2k、xp系統只有vc6的一些dll庫,而沒有vc2005、vc2008所需要的dll庫以及相應的manifest清單檔案,而在vista系統或者即將到來的windows 7系統上則包含有vc2005、vc2008的dll庫和manifest清單檔案)
ps:上面的那段話說的有點幼稚和簡單了,這裡涉及到很多的問題:程式的公升級更新、vs的補丁、庫的版本問題等等,不是簡單的拷貝、貼上就能解決的。。。
舉個例子:(在xp sp3系統下)
使用vc2008 express sp1版(沒有mfc、atl),新建乙個「helloworld」的「win32控制台應用程式」工程,在release下編譯,此時預設的編譯選項:(在這裡我們只關注與我們的問題相關的幾個選項)
1、工程「屬性」->「配置屬性」->「c/c++」->「**生成」->「執行庫」
預設選項為/md(release)、/mdd(debug),對這幾個編譯選項不清楚的可以參見:
vc執行庫版本不同導致鏈結.lib靜態庫時發生重複定義問題的乙個案例分析和總結
2、工程「屬性」->「配置屬性」->「清單工具」->「輸入輸出」->「嵌入清單檔案」
預設選項為「是」(表示將manifest清單檔案嵌入到程式中);當然,我們也可以選擇「否」,從而單獨生成乙個manifest清單檔案,不過這會增加不必要的依賴項,因此不建議選擇「否」。
編譯->鏈結之後
在「 helloworld 」工程的release或debug目錄下,我們能夠看到乙個helloworld.exe.intermediate.manifest清單檔案(
根據編譯選項,見上,vc2008將manifest清單檔案嵌入到了exe程式中,helloworld.exe.intermediate.manifest清單檔案是乙個臨時檔案,但它的內容與嵌入到exe程式的manifest檔案是一樣的
),用文字編輯器開啟該檔案(
),大致內容如下:
ps:在網上看到另外的乙個方法,用記事本開啟exe或dll程式,檢視嵌入到exe或dll中的manifest清單檔案,方法:「
開啟記事本,然後將exe或dll拖入到記事本中,當然了,肯定會出現大段的亂碼,沒關係,直接往後看,就能發現類似於下面的內容的部分」
xml語言: helloworld.exe.intermediate.manifest
01 <?xml version='1.0' encoding='utf-8' standalone='yes'?>
02 03
04 05
06 07
08 09
10 11
12 13
14 15
我們重點檢視紅色部分,這說明編譯後的exe程式依賴於vc90(也即vc2008)的crt(c執行時庫),版本9.0.210022.8(這是由於使用/md選項,程式動態的依賴於crt,如果使用/mt選項,則會將crt靜態鏈結到程式中,當然,這會使程式的尺寸急劇的增長,大概有10倍的大小差距)
當exe程式執行時,它會根據嵌入的manifest檔案查詢相應的依賴項,在這個helloworld.exe程式中,它依賴於vc90 crt,因此它會在「c:\windows\winsxs」和「
當前目錄」下查詢相應的dll庫以及manifest檔案,(
這裡指的是xp系統,不考慮vista系統,具體的參見:
程式集搜尋順序
)在我的機器上
有2個版本的vc90 crt(由於安裝了vc2008 express sp1)
vc90 crt的dll庫位於
(9.0.21022.8版本)「c:\windows\winsxs\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375」
相應的manifest檔案則位於「c:\windows\winsxs\manifests\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.21022.8_x-ww_d08d0375.manifest」
vc90 crt的dll庫位於
(9.0.30729版本)「c:\windows\winsxs\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_6f74963e」
相應的manifest檔案則位於「c:\windows\winsxs\manifests\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.1_x-ww_6f74963e.manifest」
在這裡我們就有乙個疑問了,我們的開發環境是vc2008 express sp1,那麼我們的程式鏈結的crt版本應該是9.0.30729版本
的啊?(
這個不是我瞎說的,大家可以用
dependency walker
來檢視程式實際鏈結的dll版本
),為什麼在manifest檔案中依賴的crt卻是9.0.21022.8版本
的?這裡就涉及到乙個新的名詞「policy ",作業系統會根據c:\windows\winsxs\policies\x86_policy.9.0.microsoft.vc90.crt_1fc8b3b9a1e18e3b_x-ww_b7353f75\9.0.30729.1.policy檔案的內容,進行dll版本的跳轉(
重點看深藍斜體字部分
)從而選擇了9.0.30729版本
的vc90 crt (這個所謂的「policy跳轉」是道聽途說來的,具體的英文資料藏在microsoft的什麼地方我就不得而知了。裡面夾帶了一些我自己的主觀猜測,不然的話,沒有辦法解釋manifest版本號9.0.21022.8是,而實際鏈結的dll的版本號卻是9.0.30729)
xml語言:
9.0.30729.1.policy
01 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
03 04 05
06 07
08
0910
11 12 如果
我們將這個helloworld.exe拷貝到其它的機器上(沒有安裝vc2008 sp1或
microsoft visual c++ 2008 sp1 redistributable package (x86)
),則程式因為沒能找到vc90 crt,而不能執行,彈出「
應用程式配置不正確,程式無法啟動」對話方塊。
根據參考資料的文章中的內容,對於release版程式,有乙個簡單的辦法就是安裝「vcredist_x86.exe」,檔案大小4m左右,自動安裝在「c:\windows\winsxs」目錄下,包含了crt、mfc、atl等庫的dll和manifest清單檔案;整個安裝時間不到1分鐘。
如果機器上安裝了vc2005/vc2008,則會自動的安裝vcredist_x86.exe程式,安裝後在「控制面板」->「新增刪除程式」
中有一項「microsoft visual c++ 2008 redistributable - x86 9.0.3.729」(我安裝的是microsoft visual c++ 2008 sp1 redistributable package (x86) 版
本) 注意:要
根據編譯器版本以及vc2005/vc2008是否安裝了sp1補丁進行選擇
對應的vcredist.exe版本
續接:「應用程式配置不正確,程式無法啟動」詳細舉例(2)(vc2008 sp1)
解決」應用程式配置不正確,程式無法啟動」問題
基於mfc開發的程式在發布或是在沒有安裝vs環境的機器上執行時,會報 應用程式配置不正確,程式無法啟動 類似這樣的錯誤,根本原因就是沒有對應的依賴庫檔案或是版本不對。解決的方法是先找出依賴的哪些檔案,在編譯程式的目錄下查詢 exe.intermediate.manifest檔案,檔案的內容可能長這樣...
程式無法執行,提示「應用程式配置不正確」
程式原本正確執行,但包含了boost乙個標頭檔案 asio.hpp 重新編譯後,雙擊exe後出現錯誤 由於應用程式配置不正確,應用程式未能啟動。重新安裝應用程式可能會糾正這個問題。網上查了很多,最終都指向微軟的manifest 清單檔案。這個檔案是為了解決不同版本的dll衝突問題,具體作用請 goo...
由於應用程式的配置不正確,應用程式未能啟動
方法一 在類似c program files microsoft visual studio 8 vc redi st debug nonredist x86 microsoft.vc80.debugcrt 下找到了下列檔案 msvcm80d.dll msvcp80d.dll msvcr80d.dl...