VC 問題集錦

2021-06-18 05:51:53 字數 1779 閱讀 7332

竟然,兩次遇到同乙個問題,第二次,解決的時候還沒意識到我之前就碰到過這個問題,依然是一頓搜尋。直到看到答案的時候才發現之前幹過這件事情。看來有必要記錄一下這些東西了。

往往出現在vs剛裝好的時候,想編個簡單的程式測試一下,在編譯鏈結的時候就出現了這樣的錯誤:link : fatal error lnk1123: 轉換到 coff 期間失敗: 檔案無效或損壞。再簡單的程式都還是會出現這樣的錯誤。

就我所遇到的情況,出現問題的ide是vs2010沒帶sp1補丁的,一種情況是系統是64位的,另一種情況是系統裡面還有其他vs版本,比如2008,2012。

微軟的文件對此是這樣描述的:

轉換到 coff 期間失敗: 檔案無效或損壞

該物件或資源未能轉換為通用物件檔案格式 (coff)。

輸入的檔案必須具有 coff 格式。 如果輸入的檔案不是 coff,鏈結自動將 32 位 omf 物件轉換到 coff 或執行 cvtres。exe 轉換資源檔案。

若要解決此問題,請檢查以下可能的原因:

檔案是否已經損壞?

是該檔案是有效的檔案型別嗎? 無效型別的乙個示例是 16 位 omf 物件。

您正在執行的版本早於 visual c++ visual c++ 2010 service pack 1 (sp1) 嗎?

他說的十分籠統,有人嘗試過公升級為sp1,但是,這個問題依然沒有解決。

出問題的原因確實是資源檔案轉換到coff格式時,出現了問題。在我這裡的問題是,用於轉換的程式cvtres.exe(在microsoft visual studio 10.0\vc\bin\cvtres.exe裡面的),竟然是乙個執行了就會報錯被關閉的程式,所以資源一直沒有辦法轉換成coff檔案格式,然後當他要鏈結的時候,也就報錯了(檔案格式不對)。

網上流傳著一種治標不治本的方法:

將 專案|專案屬性|配置屬性|清單工具|輸入和輸出|嵌入清單 「是」改為「否」即可。這樣做的問題是,一則十分麻煩,每個程式都要這麼改。二則當我建立mfc程式的時候,這樣的方法就失效了,似乎這樣的解決方案只在命令列程式中起作用。這種解決方案能夠起作用的原因,我想應該是對於控制台程式,唯一的資源就是那個清單檔案(manifest),如果,我們要求不要生成清單或者不嵌入清單,那麼也就沒有要處理的資源,也就不需要cvtres.exe程式,將其轉換成coff格式,也就不會出錯了。而對於,mfc程式,資源遠不止清單檔案一種,所以這種方法對他是失效的。

還有一種治本的方法(前人經驗):

系統裡面會有多個版本的cvtres.exe,像我64位的系統裡面至少有4個版本的cvtres.exe。

microsoft visual studio 10.0\vc\bin\

c:\windows\microsoft.net\framework\v4.0.30319

c:\windows\winsxs\x86_netfx-cvtres_for_vc_and_vb_b03f5f7f11d50a3a_6.1.7601.17514_none_ba1c770af0b2031b

c:\windows\winsxs\amd64_netfx-cvtres_for_vc_and_vb_b03f5f7f11d50a3a_6.1.7601.17514_none_726f4033dc35da15

如我之前說過的,第乙個版本的cvtres.exe,不知何種原因是無法執行的,所以我用第二個cvtres.exe替換了第乙個。(當然,事先要做好備份工作,以便有反悔的機會。)

如果,你裝有幾個版本的vs,那麼就會有更多版本的cvtres.exe。可能需要注意,哪個版本的vs呼叫了哪個版本的cvtres.exe。再看看他那個版本的cvtres.exe是否能執行。

VC技巧集錦

呵呵,最近在學vc。不過沒有作長遠打算。hangwire發表於2001 12 29 8 39 30 問題一 解決workspace中的classview顯示混亂 解答 即新增的成員變數或函式不能顯示 即使顯示出來了變數或函式,雙擊後不能跳至正確的位置。刪除.ncb檔案,再rebuild all,即可...

VC常用技巧集錦 一

一。如何限制編輯框中的准許字元以及修改輸入的字元 使用classwizard處理wm char訊息,計算nchar參量並決定所執行的操作,使用者可以確定是否修改 傳送字元。下例說明了如何顯示字母字元,如果字元是字母字元,則呼叫cwnd onchar,否則不呼叫onchar.void cmyedit ...

VC常用技巧集錦 一

一。如何限制編輯框中的准許字元以及修改輸入的字元 使用classwizard處理wm char訊息,計算nchar參量並決定所執行的操作,使用者可以確定是否修改 傳送字元。下例說明了如何顯示字母字元,如果字元是字母字元,則呼叫cwnd onchar,否則不呼叫onchar.void cmyedit ...