fatal error C1900: “P1”(第“20081201”版)和“P2”(第“20080116”版)之间 Il 不匹配

编译64位库时发生错误:fatal error C1900: “P1”(第“20081201”版)和“P2”(第“20080116”版)之间 Il 不匹配


IL - Intermiate Language(不是managed code中的MSIL哦),有时也称Intermediate Representations,是编译链接code generation时使用内部语言。

LTCG (Link Time Code Generation)
 主要原因:

链接时使用了某些用更新的编译器编译的LTCG的library。之所以x86是正常的,是因为很巧链接时使用的x86 lib是普通lib,而amd64 lib是LTCG lib.


解决方案:两种

1)更新当前使用的编译链接工具,使其与lib匹配。当然,这样编译出来的二进制文件可能会有所改变(优化可能不同),所以可能需要重新测试。
2)使用不带LTCG的library

Details:

MSDN上关于C1900的信息:
Error Message?IL mismatch between 'tool1' version 'number1' and 'tool2' version 'number2'
Tools run in various passes of the compiler do not match. number1 and number2 refer to the dates on the files. For example, in pass 1, the compiler front end runs (c1.dll) and in pass 2, the compiler back end runs (c2.dll). The dates on the files must match and if they do not, reinstall and use the current version of each tool.

IL - Intermiate Language(不是managed code中的MSIL哦),有时也称Intermediate Representations,是编译链接code generation时使用内部语言。

普通的编译链接过程:
1) 预编译 preprocess
2)前端编译 (c1/c1xx) - 这一步将产生IL
3) 后端编译 (c2) - 这一步将使用IL,并产生真正的二进制码
4)链接 - 这一步将链接所有的obj/lib,合并PE的各个section,resolve symbol等等,然后产生最终的binary

可以注意到一点:C1900是一个编译错误,因为通常IL由编译器的前端产生,后端使用。但是我们是在链接阶段遇到,所以几乎可以肯定使用了LTCG。

LTCG - msdn.microsoft.com/library/CHS/vccore/html/vcgrfLTCGLinktimeCodeGeneration.asp
LTCG (Link Time Code Generation) 或者称WPO (Whole Program Optimization)
- 因为编译时通常只有当前模块的信息,而链接时可以获得整个程序的全貌,所以在链接时生成代码理论上可以获得更高的优化效果。LTCG的实现方式是将第三步(c2)与第四步链接合并,也就是链接link.exe会调用c2.dll,使用IL,并且产生真正的二进制码。合并后的编译链接过程变为:
1)compile: cl.exe?/GL
2) link: link.exe /LTCG
而且,LTCG允许对单个模块进行优化--也就是说不必对所有的模块使用/GL,链接时只要检测到一个模块(obj/lib)是用/GL编译的,链接就会使用LTCG。

我们之所以会遇到这个错误,就是因为链接时使用的一个lib是使用'20060201' c2.dll /GL 进行的编译,含有只有'20060201' c2.dll才能解释的IL,然而我们用的build环境是'20050411'版本,link.exe调用的是'20050411'的c2.dll。

使用link -dump -disasm <yourlib.lib>可以检验是否使用了/GL。普通的lib dump出来会看到汇编代码,而含有IL的lib不会
检验一个文件是否是LTCG lib库的方法:打开命令行,进入到link.exe文件所在的路径,输入命令link  -dump -disasm <yourlib.lib>,如下所示

C:\Program Files\Microsoft Visual Studio 10.0\VC\bin>link  -dump -disasm E:\Workspace\CloudPub\Trunk\__Internal\Libs\jepglib8c64.lib


,如果不是LGCT lib,则输出显示如下汇编代码:
            Summary

          1C .bss
       58BCC .debug$S
        12C0 .debug$T
         8D0 .drectve
        22D4 .pdata
        2B20 .rdata
       3198F .text
        3A58 .xdata
 如果是,则输出显示

    TYPE:library


检查之后发现jepglib8c64.lib文件时LGCT库,重新编译成非LGCT库即可正常编译:

编译方法:设置项目-->属性-->配置属性-->常规-->项目默认值-->全程序优化选择“无全程序优化”


  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: fatal error c1001: internal compiler error是编译器内部错误的一种,通常是由于编译器本身的问题导致的。这种错误通常需要开发人员对编译器进行调试和修复。建议您尝试更新编译器本或联系编译器开发者以获取更多帮助。 ### 回答2: fatal error c1001: internal compiler error是由于Visual Studio编译器在处理代码时遇到了无法处理的内部错误而导致的编译失败。这个错误可能是由编译器本身的错误引起的,或者是由代码中的错误或异常引起的。下面是一些常见的导致编译器错误的原因: 1. 代码中的语法错误或逻辑错误: 代码中的错误或异常可能导致编译器无法正确处理代码。 2. 编译器软件本身的错误:编译器软件本身有时会出现错误,并且可能无法正确处理某些代码或语法结构。 3. 编译器与编译环境的不匹配:编译器与某些库或操作系统不兼容时,可能会导致错误。 4. 代码文件损坏或缺失:代码文件已损坏或缺失的情况下,编译器可能无法正确处理代码。 为了解决fatal error c1001: internal compiler error,可以尝试以下方法: 1. 重新编译代码:尝试重新编译代码,以检查是否存在语法错误或逻辑错误。 2. 更新编译器:更新编译器软件,确保使用最新本。 3. 更改编译环境:检查编译环境的设置与编译器的之间是否匹配,必要时更改。 4. 恢复丢失文件:恢复丢失的代码文件或替换可能损坏的代码。 如果以上方法没有解决问题,还可以使用其他编译器进行编译,或者通过将代码片段删除进行排查。如果问题仍然存在,可以尝试寻求帮助进行解决。 ### 回答3: fatal error c1001: internal compiler error是一个由Visual C++编译器输出的错误信息,表明编译器在编译源代码时遇到了一个内部错误,导致编译失败。这通常是由编译器自身的错误引起的,而不是源代码中的语法或逻辑错误。 这种错误通常很难调试,因为它没有提供有关发生错误的具体位置或原因的详细信息。但是,有几种可能的原因可能导致此错误: 1. 编译器已损坏或存在软件错误。在这种情况下,您可以尝试更新或重新安装Visual C++编译器,并确保使用最新本的编译器。 2. 编译器资源不足。如果编译器无法分配足够的内存或其他系统资源来编译源代码,则可能会导致编译器错误。您可以尝试关闭其他正在运行的应用程序或增加系统RAM来解决此问题。 3. 源代码可能包含某些错误或不规范的语法,这可能会触发编译器内部错误。在这种情况下,您可以尝试检查源代码,并确保它符合正确的C++编码约定。 总之,遇到fatal error c1001: internal compiler error时,重要的是要先尝试各种解决方法,并排除可能的问题,以确保能够成功编译源代码。如果所有尝试都失败,请尝试与编译器开发人员或社区联系,以寻求更多的帮助和支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值