程式初始化失敗的解決辦法

2021-05-24 21:55:01 字數 2563 閱讀 7224

幾種可能的解決辦法:

1、這兩個問題的原因是目標機器上缺少vc8相關的執行庫或者版本不匹配,最簡單的解決方案就是把vc安裝目錄下vcredist_x86目錄下的vcredist_x86.exe在目標機器上執行一把,把庫安裝上去就解決了。

2、是缺少了dll檔案所導致的這個錯誤,只要把以下dll複製到執行程式exe的當前目錄下面,就可以了,這幾個dll分別是:(msvcm80.dll,msvcp80.dll,msvcr80.dll,microsoft.vc80.crt.manifest)或(msvcm80d.dll、msvcp80d.dll、msvcr80d.dll、microsoft.vc80.debugcrt.manifest)

3、vc++2005對dll的版本要求非常嚴格,對於用vc++2005編寫的程式和動態鏈結庫,release版本的程式必須呼叫release版本的dll,debug版本的程式必須呼叫debug版本的dll,否則就可能出現這個問題。

最近幾天被這個問題困惑了許久。用vc2005編譯的程式,編譯時沒有任何錯誤,但是執行時就是提示「應用程式正常初始化失敗」!!查詢了各方面資料,做了各種嘗試,網上說什麼的都有:有讓安裝vc2005 sp1補丁的;有讓安裝vcredist_x86.exe的;有讓把crt庫的dll直接拷貝到程式目錄的;有讓清理登錄檔的;有讓裝.netframework新版本的;有讓查manifest的;結果我嘗試了半天,幾乎都是浪費時間。現在把處理的方法說一下,省得大家再走彎路:

1、vc2003、vc2005、vc2008及其後續版本,對底層最基本的crt、mfc、atl庫都進行了重構,為了避免不同版本的庫引起衝突,重構後的庫檔案一般放在 c://windows/winsxs 資料夾中,並用特定的資料夾/檔名稱進行標識;

2、與vc6不同, vc2003、vc2005、vc2008及其後續版本,引入了manifest清單的概念,即應用程式編譯後會同時生成對應的.manifest檔案,並將該.manifest檔案作為資源編譯到dll或者exe中去。.manifest檔案實際上是乙個xml格式的文字檔案,裡面記錄了dll或exe中要引用的crt、mfc、atl庫的版本和名稱。vc6編譯的應用程式對crt、mfc、atl的dll都是直接呼叫,而vc2003、vc2005、vc2008編譯的程式都是先查詢編譯到資源中的manifest中的記錄,然後按照記錄提供的版本和名稱去搜尋對應的crt、mfc、atl庫以及隨庫發布的.manifest檔案,搜尋的路徑包括當前目錄、c://windows/winsxs 等等,如果沒有找到對應的庫檔案,則提示「應用程式正常初始化失敗」;

3、用文字編輯器開啟exe或dll對應的.manifest檔案,檢視它引用的crt、mfc、atl庫的版本;或者,用ultraedit直接開啟exe或者dll,從資源區中找到編譯進去的.manifest資訊,找到它引用的crt、mfc、atl庫的版本;或者,執行程式,當程式彈出「應用程式正常初始化失敗」對話方塊時,開啟事件檢視器,可以看到出錯的原因是因為缺少了某某版本的crt、mfc、atl庫,這個庫的版本資訊一般類似於「microsoft.vc80.debugcrt」,之後到c://windows/winsxs 或者vc200x的安裝資料夾中搜尋包含這個字串的資料夾和檔案,將搜尋到的dll和.manifest檔案都拷貝到應用程式所在的資料夾中,其中,.manifest檔案必須重新命名(例如重新命名為microsoft.vc80.debugcrt),這樣應用程式就可以正常執行了;

關於生成清單:

vs2005在生成可執行檔案時使用了一種新的技術,該技術生成的可執行檔案會伴隨生成乙個清單檔案(manifest file)(.manifest字尾檔案)(其本質上是xml文件,你可以用文字編輯器開啟看看),並在鏈結完成後將該清單檔案嵌入到exe檔案中(預設情況下)。而在fat32檔案系統中,在處理清單檔案階段,當增量鏈結時不能完成清單檔案的更新(預設情況下),於是造成清單檔案嵌入失敗,從而使該exe檔案執行時沒有相應的清單檔案而執行失敗並提示如上錯誤。

解決方案很多,列舉如下:

1、由於這是在鏈結動態執行庫出現的問題,所以你可以選擇**生成的連線方式為/mtd而非/mdd,不用這些dll檔案從而避免問題的出現。該方法有乙個很顯然的缺點:適用範圍有限,不推薦該方法。

2、既然跟fat32系統有關,那麼我們可以選擇在ntfs檔案系統中開發從而避免該問題,此方法同上,也是採用的迴避問題的方式,不提倡。

3、該方法仍與fat32有關:在專案的「屬性|配置屬性|清單工具|常規」中的「使用fat32解決辦法」選擇「是」(預設為「否」),重新生成專案即可解決問題。該方法是唯一真正針對問題所在而提出的解決方法,使清單工具可以正確更新。(此方法是官方解決方法,也比較方便,推薦)

4、既然問題是在更新嵌入的清單檔案時發生的,由於fat32的原因而未能更新嵌入的清單檔案,於是我們有如下兩種解決方法:

1) 不啟用增量鏈結。在專案的「屬性|配置屬性|鏈結器|常規」中的「啟用增量鏈結」選擇「否」。此方法阻斷了問題產生的源頭,其每次生成exe檔案時都直接嵌入清單檔案,而不是預設的根據時戳而決定是否更新清單檔案。

2)不嵌入清單檔案。在專案的「屬性|配置屬性|清單工具|輸入和輸出」中的「嵌入清單」選擇「否」,從而在生成exe檔案時附隨生成乙個清單檔案(預設情況下,其檔名為exe檔案的全名加上「.manifest」),避免了嵌入清單檔案可能失敗的問題。在程式執行時,會用到該清單檔案。顯然,這種方式使可執行程式產生了更多的外部依賴,不推薦。

hostname f 失敗解決辦法

hostname fzk uname n fzk 當 hostname f 時報錯 未搜尋到主機名 產生這個原因時因為 etc hosts和 etc sysconfig network配置問題 etc sysconfig network networking yes hostname fzk etc...

Ubuntu su 認證失敗 解決辦法

原因 ubuntu安裝後,root使用者預設是被鎖定了的,不允許登入,也不允許 su 到 root 對於桌面使用者來說這個可能是為了增強安全性,但是伺服器版上的沒這個還真不行,趕緊設定下吧。解決方案 username ubuntu sudo passwd enter new unix passwor...

cocoapods安裝失敗解決辦法

1.安裝pod的時候報錯如下 last login sun oct 18 07 49 45 on console password building native extensions.this could take a while.error error installing cocoapods ...