vs 錯誤1------"無法啓動程序'...debug/abc.exe',系統找不到指定文件"的問題!

     之前一直把收穫的東東寫在自己硬盤的記事本里,覺得不是長久之計,也來效仿下各位同志,就寫在博客裏啦,今天開始堅持做。微笑着開始,微笑着繼續。。。。。。

昨天幫一組員運行已程序,出現錯誤,於是搜索之,得——

"無法啓動程序'...debug/abc.exe',系統找不到指定文件"的問題!

解決方案如下:
VS 2005在生成可執行文件時使用了一種新的技術,該技術生成的可執行文件會伴隨生成一個清單文件(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”),避免了嵌入清單文件可能失敗的問題。在程序運行時,會用到該清單文件。顯然,這種方式使可執行程序產生了更多的外部依賴,不推薦。

    另外,還有一個不能稱爲方法的土辦法:每次Build前手動刪除*.ilk文件(增量鏈接文件)(當然可以在項目屬性中寫入刪除命令,使其自動執行),不推薦該土辦法。
    最後,總結一下:
    1. 此問題只在特定條件下才會出現:在FAT32文件系統中編譯、默認設置(增量模式、不啓用FAT32解決方案、嵌入清單文件)、非第一次生成可執行文件文件(即在增量連接、更新清單文件時)。
    2. 解決方案14.1方便實用,推薦使用。 

設置過FAT32後好了。卻又有新問題了,其實也是老問題,自己的程序很久前就出現過,只是沒有去追究,現在很有興趣了,繼續搜索,詳見下篇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章