1. 程式人生 > >解決VS除錯提示“無法啟動程式,'...exe'.系統找不到指定檔案。”的問題

解決VS除錯提示“無法啟動程式,'...exe'.系統找不到指定檔案。”的問題

圖1

        當VS除錯提示上圖所示的警告時,常用的方法是檢查“專案”-“屬性”-“配置屬性”-“常規”-“輸出目錄”裡的路徑跟圖1裡的路徑是否相同,若不同,則手動改正。在這裡我的是沒有問題的,都是在bin資料夾裡,如圖2所示:​​

圖2

        說明這不是問題的所在,然後網上給出的方案是這樣的:

​【
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. 解決方案1和4.1方便實用,推薦使用。
​】

        然而通過上述操作並沒有解決我的問題​,在參考了這篇文章後有所頓悟:(http://blog.sina.com.cn/s/blog_830e3a720102vuyh.html),儘管它的方法也行不通,但對於我們理解問題是有幫助的,在圖1中提示了“系統找不到指定的檔案”,那是因為沒有將RiemannMapper.exe寫入到bin資料夾中,既然我們的寫入路徑是正確的,那還有一種可能就是寫入的名稱是錯的,到“專案”-“屬性”-“配置屬性”- “連結器” -“常規”-“輸出檔案”裡一看果然是有問題的,如圖3所示:

圖3

        我們手動改為RiemannMapper.exe,如圖4所示:

圖4

        這樣就OK了,搞定!