【转】fatal error C1900: “P1”(第“20081201”版)和“P2”(第“20080116”版)之间 Il 不匹配
背景:今天傻逼逼地想用vs2010来编译一个vs2013的项目,其中这个项目用到了一个库(应该是用2013编译的)
在我浅薄的认知中,以为只是13支持的特性更多,如果没有用到一些2010编译器不支持的特性应该用10也是能跑的,
结果告诉我,我是那么的天真,其中还要跨越一个叫链接器这样的领域(然而我又不太懂这个编译器,只是稍微了解过)
结果就出现了c1900,参考了这个资料后,大概明白了原来还有ltcd这回事。。。
总结一下文章要点,详情请点入去看,这里就不直接帖过来了。
总结:
IL - Intermiate Language,有时也称Intermediate Representations,是编译链接code generation时使用内部语言。
LTCG (Link Time Code Generation)
主要原因:
链接时使用了某些用更新的编译器编译的LTCG的library。
解决方案:两种
1)更新当前使用的编译链接工具,使其与lib匹配。当然,这样编译出来的二进制文件可能会有所改变(优化可能不同),所以可能需要重新测试。
2)使用不带LTCG的library
普通的编译链接过程:
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。
具体操作:首先判断使用的lib是否是LTCG库,然后把其编译成非LTCG库即可:
1.检查:
使用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
亲测命令可用:
2.编译:
编译方法:设置项目-->属性-->配置属性-->常规-->项目默认值-->全程序优化选择“无全程序优化”
【转】fatal error C1900: “P1”(第“20081201”版)和“P2”(第“20080116”版)之间 Il 不匹配的更多相关文章
- 编译x64c++出错,errorC1900:P1和P2之间 Il 不匹配问题
搜索了下相关资料,有一个说法是编译x64时本地缺失一些东西,2015安装update3就行. 我的是2013update4,找了下最新的有update5,安装然而并没有什么用. 最后还是重新找对应版本 ...
- fatal error C1047: 对象或库文件“.\x64\Release\Des.obj”是使用比创建其他对象所用编译器旧的编译器创建的;请重新生成旧的对象和库
问题描述: 在把一个32位的dll编译成64位的时候提示上面的错误 解决办法: >属性->常规->项目默认值->全程序优化 将这里的默认项 "使用链接时间代码生成& ...
- maven 启动 报错 Fatal error compiling: 无效的目标发行版
http://news.tuxi.com.cn/news/119999990123162/31622105.html http://lyking2001.iteye.com/blog/837440 针 ...
- Fatal error compiling: 无效的目标发行版: 1.8 -> [Help 1] (zhuan)
http://blog.csdn.net/z18137017273/article/details/53033613 ***************************************** ...
- maven 编译出错Fatal error compiling: 无效的目标发行版: 1.8 -> [Help 1] 解决办法
这几天在为公司项目搭建一个后台框架,使用的是eclipse-Mars自带的maven插件,在maven进行编译的时候,出现Fatal error compiling: 无效的目标发行版: 1.8 -& ...
- Maven 错误:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project appservice-common: Fatal error compiling: 无效的目标发行版: 1.8
通过IDEA 提供的面板 执行package 或者 install 没有错误,但是cmd terminal 窗口就不行!出现: Maven 错误:Failed to execute goal org. ...
- maven:Fatal error compiling: 无效的目标发行版: 1.8.0_45 -> [Help 1]
使用mvn clean install命令的时候出现如下的错误: Failed to execute goal org.apache.maven.plugins:maven-compiler-plug ...
- mysqli,Fatal error
<?php //mysql数据库类-mysqli版 //2014/6/13 class mysqlidb{ public $dbhost; public $dbuser; public $dbp ...
- 完美解决VS2003.Net fatal error LNK1201: 写入程序数据库“.pdb”时出错
我的开发环境是Win7旗舰64位+VS2003.Net,经常卡pdb错误,文末给出一个完美的解决方案和一个懒人补丁包.问题描述如下:在重新编译的时候,经常报错: fatal error LNK1201 ...
随机推荐
- ASP.NET MVC5学习笔记01
由于之前在项目中也使用MVC进行开发,但是具体是那个版本就不是很清楚了,但是我觉得大体的思想是相同的,只是版本高的在版本低的基础上增加了一些更加方便操作的东西.下面是我学习ASP.NET MVC5高级 ...
- 阿里巴巴最新开源项目 - [HandyJSON] 在Swift中优雅地处理JSON
项目名称:HandyJSON 项目地址:https://github.com/alibaba/handyjson 背景 JSON是移动端开发常用的应用层数据交换协议.最常见的场景便是,客户端向服务端发 ...
- 在DevExpress程序中使用TeeList控件以及节点查询的处理
在很多情况下,我们需要通过树列表进行数据的展示,如一些有层次关系的数据,通过有层级的展示,能够使用户更加直观查看和管理相关的数据.在一般Winform开发的情况下,可以使用微软的TreeView控件, ...
- Spring中常见的bean创建异常
Spring中常见的bean创建异常 1. 概述 本次我们将讨论在spring中BeanFactory创建bean实例时经常遇到的异常 org.springframework.beans.fa ...
- ASP.NET路由[ASP.NET Routing]
ASP.NET路由[ASP.NET Routing] ASP.NET路由允许你在使用URL时不必匹配到网站中具体的文件,因为这个URL不必匹配到一个文件,你使用了描述用户行为且更容易被用户理解的URL ...
- java多线程解读二(内存篇)
线程的内存结构图 一.主内存与工作内存 1.Java内存模型的主要目标是定义程序中各个变量的访问规则.此处的变量与Java编程时所说的变量不一样,指包括了实例字段.静态字段和构成数组对象的元素,但是不 ...
- 开始我的IT博客之旅
这是一个好的开始,过程很漫长,但我却乐在其中. 在大学之际,这是我的又一个开始,随便写点啦. 想把每一次的过程记录下来 这样以后对自己 对别人都会有所帮助. 好啦 作为一名大三的学生党 加油吧!
- HTML常用标签
HTML常用标签: HTML文档格式: 首先,HTML是一种超文本标签语言,它是制作网页的基础. 其次,HTML文档中至少包含基本的和成对的<html> </html>.< ...
- observejs改善组件编程体验
传送门 observejs:https://github.com/kmdjs/observejs 本文演示:http://kmdjs.github.io/observejs/list/ 本文代码:ht ...
- Javascript前端和JAVA后端对加密库的处理实例
前端加密 Javascript的加解密有开源的库,http://www.oschina.net/p/crypto-js/ 如下是具体的使用例子 <!DOCTYPE html> <ht ...