【转】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 ...
随机推荐
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 9.插件引擎设计
目 录 第九章 插件引擎设计... 2 9.1 框架的契约-接口... 2 9.2 插件的雏形-抽象类... 3 9.3 ...
- WEB项目会话集群的三种办法
web集群时session同步的3种方法 在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上, 如果session不同步的 ...
- 了解AIDL
1.什么是AIDL? Android Interface Definition Lauguage(android接口描述语言)是一个IDL语言. 2.AIDL的作用? 背景:在android平台 中, ...
- H5 本地存储一
localStorage(本地存储),可以长期存储数据,没有时间限制,一天,一年,两年甚至更长,数据都可以使用.sessionStorage(会话存储),只有在浏览器被关闭之前使用,创建另一个页面时同 ...
- 基于JQuery的获取鼠标进入和离开容器方向的实现
做动画时,需要判断鼠标进入和退出容器的方向.网上找到的基于JQuery的实现方法,用函数封装了一下,写了一个示例.注意绑定鼠标事件用的是on(),所以JQuery版本需高于1.7. <!DOCT ...
- ZeroC Ice启用SSL通讯的配置
Zeroc ICE ( Internet Communications Engine )中间件号称标准统一,开源,跨平台,跨语言,分布式,安全,服务透明,负载均衡,面向对象,性能优越,防火墙穿透,通讯 ...
- [Android]使用Dagger 2依赖注入 - 自定义Scope(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5095426.html 使用Dagger 2依赖注入 - 自定义 ...
- 初步进行vs单元测试
首先提一下vs的安装过程,在官网下载免费社区版到本地,根据提示选择安装路径.以及大部分包文件开始安装,等待即可. eclipse的安装比vs多了JDK的下载安装,配置正确的path,以及在eclips ...
- Atitit.redis操作总结
Atitit.redis操作总结 1.1. 获取redis所有kv1 1.2. dbsize:返回当前数据库中key的数目 1 1.3. 一起吧所有key列出来1 1.4. Java连接redis ...
- SQL Server会话KILL不掉,一直处于KILLED /ROLLBACK状态情形浅析
今天遇到一个很奇怪的情况,发现一个会话异常,这个会话只是在执行一个简单的存储过程,里面使用了链接服务器(Linked Server)查询另外一台服务器数据(存储过程里面没有任何显性事务.UPDATE. ...