竟然,两次遇到同一个问题,第二次,解决的时候还没意识到我之前就碰到过这个问题,依然是一顿搜索。直到看到答案的时候才发现之前干过这件事情。看来有必要记录一下这些东西了。
LINK : fatal error LNK1123
问题出现的症状:
往往出现在VS刚装好的时候,想编个简单的程序测试一下,在编译链接的时候就出现了这样的错误:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 。再简单的程序都还是会出现这样的错误。
问题出现的背景:
就我所遇到的情况,出现问题的IDE是VS2010没带SP1补丁的,一种情况是系统是64位的,另一种情况是系统里面还有其他VS版本,比如2008,2012。
问题出现的原因:
微软的文档对此是这样描述的:
转换到 COFF 期间失败: 文件无效或损坏 该对象或资源未能转换为通用对象文件格式 (COFF)。 输入的文件必须具有 COFF 格式。 如果输入的文件不是 COFF,链接自动将 32 位 OMF 对象转换到 COFF 或运行 CVTRES。EXE 转换资源文件。 若要解决此问题,请检查以下可能的原因:
|
出问题的原因确实是资源文件转换到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是否能运行。