【转】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 Core 静态文件及JS包管理器(npm, Bower)的使用
在 ASP.NET Core 中添加静态文件 虽然ASP.NET主要大都做着后端的事情,但前端的一些静态文件也是很重要的.在ASP.NET Core中要启用静态文件,需要Microsoft.AspNe ...
- [C1] 仿 Excel 实现(C1FlexGrid)
一 分析阶段 根据 Excel 表格区域的划分,如下图,基本上以4行*3列的框架搭建: 第一行为列头区域 ==> C1FlexGrid.ColumnHeaders 第二行为单元格区域 ...
- html文本垂直居中对齐
html文本垂直居中对齐,代码如下: <div id="box" style="height:100px; line-height:100px; border:1p ...
- js的命名规范
js的命名规范 1.驼峰命名法:首字母是小写的,接下来的字母都以大写字符开头.例如: var testValue = 0; var oneValue = 10; 2. ...
- IOS 2D游戏开发框架 SpriteKit-->续(创建敌对精灵)
这次包括之后讲的spritekit 我都会围绕一个案例来说,这个案例就是一个简单的2d飞机大战游戏,今天这里我讲创建敌对精灵,就是敌对飞机,敌对飞机不停的被刷新到屏幕上.....当然这里涉及到的类其实 ...
- ERDAS 2014安装破解及汉化图文教程
关于ERDAS 2014 的安装破解及其汉化过程: 说明:汉化只是之针对英语能力不能正常满足使用软件的朋友们.如果英语过专八,完全没有必要汉化!在此之前查了好多关于ERDAS汉化的文档,可惜只是简单的 ...
- cmd命令汇总
一 cmd 命令 cmd命令大全(第一部分) winver---------检查Windows版本 wmimgmt.msc----打开windows管理体系结构(WMI) wupdmgr------ ...
- 使用python处理子域名爆破工具subdomainsbrute结果txt
近期学习了一段时间python,结合自己的安全从业经验,越来越感觉到安全测试是一个体力活.如果没有良好的coding能力去自动化的话,无疑会把安全测试效率变得很低. 作为安全测试而言,第一步往往要通过 ...
- Google C++单元测试框架GoogleTest---GMock的CheatSheet文档
CheatSheet文档中包含了GMock所有常用的东西,看了这个基本上就可以用它了,本文接上篇博文:Google C++单元测试框架GoogleTest---Google Mock简介--概念及基础 ...
- Webform(七)——内置对象(Session、Application)和Repeater的Command操作
内置对象:用于页面之间的数据交互 为什么要使用这么内置对象?因为HTTP的无状态性. 一.内置对象 (一)Session 跟Cookies一样用来存储用户数据 1.Session.Cookies对比 ...