fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏(嵌入清单)

问题在VS2010中也有,已解决编辑器

 

在将一VC6程序转换至VS2005时,出现了错误:fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏;研究发现是因为VS2005生成清单文件的问题。工具


    VS2005在生成可执行文件时使用了一种新的技术,该技术生成的可执行文件会伴随生成一个清单文件(manifest file)(.manifest后缀文件)(其本质上是XML文档,你能够用文本编辑器打开看看),并在连接完成后将该清单文件嵌入到exe文件中(默认状况下)。ui

    而在FAT32文件系统中,在处理清单文件阶段,当增量连接时不能完成清单文件的更新(默认状况下),因而形成清单文件嵌入失败,从而使该exe文件运行时没有相应的清单文件而运行失败并提示如上错误。   
spa

    解决方案不少,列举以下:开发

    1. 因为这是在连接动态运行库出现的问题,因此你能够选择代码生成的链接方式为/MTd而非/MDd,不用这些DLL文件从而避免问题的出现。该方法有一个很显然的缺点:适用范围有限,而且也不是我等提倡的解决问题的方式,不推荐。
文档

    2. 既然跟FAT32系统有关,那么咱们能够选择在NTFS文件系统中开发从而避免该问题,此方法同上,也是采用的回避问题的方式,不推荐。  
编译

    3. 该方法仍与FAT32有关:在项目的“属性|配置属性|清单工具|常规”中的“使用FAT32解决办法”选择“是”(默认为“否”),从新生成项目便可解决问题。该方法是惟一真正针对问题所在而提出的解决方法,使清单工具能够正确更新。(此方法是官方解决方法,也比较方便,推荐)   
配置

    4. 既然问题是在更新嵌入的清单文件时发生的,因为FAT32的缘由而未能更新嵌入的清单文件,因而咱们有以下两种解决方法:file

    4.1 不启用增量连接。在项目的“属性|配置属性|连接器|常规”中的“启用增量连接”选择“否”。此方法阻断了问题产生的源头,其每次生成exe文件时都直接嵌入清单文件,而不是默认的根据时戳而决定是否更新清单文件。
文本编辑器

    4.2 不嵌入清单文件。在项目的“属性|配置属性|清单工具|输入和输出”中的“嵌入清单”选择“否”,从而在生成exe文件时附随生成一个清单文件(默认状况下,其文件名为exe文件的全名加上“.manifest”),避免了嵌入清单文件可能失败的问题。在程序运行时,会用到该清单文件。显然,这种方式使可执行程序产生了更多的外部依赖,不推荐。

   5. 还有一个不能称为方法的土办法:每次Build前手动删除*.ilk文件(增量连接文件)(固然能够在项目属性中写入删除命令,使其自动执行),不推荐。


   最后,总结一下:此问题只在特定条件下才会出现:在FAT32文件系统中编译、默认设置(增量模式、不启用FAT32解决方案、嵌入清单文件)、非第一次生成可执行文件文件(即在增量链接、更新清单文件时)。

解决方案1,3和4.1方便实用,推荐使用。

相关文章
相关标签/搜索