今天遇到的一个无聊编译错误:C1900:IL P1 P2版本不匹配 (罪魁祸首是AMD X2 4000+?。。)

 

fatal error C1900: Il mismatch between 'P1' version '20060201' and 'P2' version '20050411'

......
Linking Executable - ...
fatal error C1900:?
IL mismatch between 'P1' version '20060201' and 'P2' version '20050411'
......
这个error仅仅在AMD64 build时出现,x86 build时是正常的。

?

?

主要原因:

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

?

解决方案:两种

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

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的各个sectionresolve 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出来会看到汇编代码,而含有ILlib不会

 

 

posted on 2009-04-08 14:31  TobyLin的学习之路  阅读(16067)  评论(0编辑  收藏  举报

导航