沒有找到MSVCP80D.dll,所以這個應用程序未能啓動。從新安裝應用程序...

    在VS 2005中創建Win32工程時(以VS 2005中文版爲例),你可能會遇到這樣的運行錯誤:「沒有找到MSVCP80D.dll,所以這個應用程序未能啓動。從新安裝應用程序可能會修復此問題。」(還多是其它幾個相似的文件:MSVCR80D.dll、MSVCM80D.dll)。對於VS2005新手,可能遇到的第一個問題即是此問題。 編輯器

    一直使用VC6進行開發測試,最近準備把平臺轉移到VS2005了。因而,決定先把CppUnit轉移到此平臺上來。在VS2005中編譯CppUnit所遇到的問題很少,雖然沒VC6方便。可是在測試編譯好的CppUnit庫時卻遇到了困難:把之前在VC6中寫的AES移植過來(其使用了CppUnit進行單元測試),在運行時卻遇到了如上錯誤。剛開始覺得多是CppUnit沒有編譯好,從新編譯CppUnit屢次,調整編譯參數,但始終有此錯誤,而且此錯誤有時出現有時不出現,這更暈了,大量時間就這樣浪費了。等我靜下來,才以爲多是VS 2005的緣由,因而上網搜索此錯誤信息,終於找到了問題所在。 工具

    VS 2005在生成可執行文件時使用了一種新的技術,該技術生成的可執行文件會伴隨生成一個清單文件(manifest file)(.manifest後綴文件)(其本質上是XML文檔,你能夠用文本編輯器打開看看),並在連接完成後將該清單文件嵌入到exe文件中(默認狀況下)。而在FAT32文件系統中,在處理清單文件階段,當增量連接時不能完成清單文件的更新(默認狀況下),因而形成清單文件嵌入失敗,從而使該exe文件運行時沒有相應的清單文件而運行失敗並提示如上錯誤。 單元測試

    解決方案不少,列舉以下:
    1. 因爲這是在連接動態運行庫出現的問題,因此你能夠選擇代碼生成的鏈接方式爲/MTd而非/MDd,不用這些DLL文件從而避免問題的出現。該方法有一個很顯然的缺點:適用範圍有限,而且也不是我等提倡的解決問題的方式,不推薦該方法。 測試

    2. 既然跟FAT32系統有關,那麼咱們能夠選擇在NTFS文件系統中開發從而避免該問題,此方法同上,也是採用的迴避問題的方式,不爲我等提倡。 ui

    3. 該方法仍與FAT32有關:在項目的「屬性|配置屬性|清單工具|常規」中的「使用FAT32解決辦法」選擇「是」(默認爲「否」),從新生成項目便可解決問題。該方法是惟一真正針對問題所在而提出的解決方法,使清單工具能夠正確更新。(此方法是官方解決方法,也比較方便,推薦) 開發

    4. 既然問題是在更新嵌入的清單文件時發生的,因爲FAT32的緣由而未能更新嵌入的清單文件,因而咱們有以下兩種解決方法:
    (1)不啓用增量連接。在項目的「屬性|配置屬性|連接器|常規」中的「啓用增量連接」選擇「否」。此方法阻斷了問題產生的源頭,其每次生成exe文件時都直接嵌入清單文件,而不是默認的根據時戳而決定是否更新清單文件。
    (2)不嵌入清單文件。在項目的「屬性|配置屬性|清單工具|輸入和輸出」中的「嵌入清單」選擇「否」,從而在生成exe文件時附隨生成一個清單文件(默認狀況下,其文件名爲exe文件的全名加上「.manifest」),避免了嵌入清單文件可能失敗的問題。在程序運行時,會用到該清單文件。顯然,這種方式使可執行程序產生了更多的外部依賴,不推薦。 文檔


    另外,還有一個不能稱爲方法的土辦法:每次Build前手動刪除*.ilk文件(增量連接文件)(固然能夠在項目屬性中寫入刪除命令,使其自動執行),不推薦該土辦法。 it

    最後,總結一下: 編譯

     1. 此問題只在特定條件下才會出現:在FAT32文件系統中編譯、默認設置(增量模式、不啓用FAT32解決方案、嵌入清單文件)、非第一次生成可執行文件文件(即在增量鏈接、更新清單文件時)。 配置

    2. 解決方案1和4.1方便實用,推薦使用。

相關文章
相關標籤/搜索