问题:创建预编译头 Debug 正常 Release Link Error

Main.obj : error LNK2005: ___@@_PchSym_@00@UmfilkilqUdrmzkkUkilqUehCAAIUnzpvnzkwzgzUnzpvnzkwzgzUivovzhvUyzhrxwzgzOlyq@ 已经在 BasicData.obj 中定义
warning C4727: 具有相同时间戳的名为 d:\nuroproj\winapp\proj\vs2008\makemapdata\makemapdata\release\makemapdata.pch 的 PCH 已存在于 d:\NuroProj\WinApp\proj\vs2008\MakeMapData\MakeMapData\Release\Make3Dm.obj 和 d:\NuroProj\WinApp\proj\vs2008\MakeMapData\MakeMapData\Release\Main.obj 中。使用第一个 PCH。
Make3Dm.obj : error LNK2005: ___@@_PchSym_@00@UmfilkilqUdrmzkkUkilqUehCAAIUnzpvnzkwzgzUnzpvnzkwzgzUivovzhvUyzhrxwzgzOlyq@ 已经在 BasicData.obj 中定义
warning C4727: 具有相同时间戳的名为 d:\nuroproj\winapp\proj\vs2008\makemapdata\makemapdata\release\makemapdata.pch 的 PCH 已存在于 d:\NuroProj\WinApp\proj\vs2008\MakeMapData\MakeMapData\Release\MakeBlkIdx.obj 和 d:\NuroProj\WinApp\proj\vs2008\MakeMapData\MakeMapData\Release\Main.obj 中。使用第一个 PCH。
MakeBlkIdx.obj : error LNK2005: ___@@_PchSym_@00@UmfilkilqUdrmzkkUkilqUehCAAIUnzpvnzkwzgzUnzpvnzkwzgzUivovzhvUyzhrxwzgzOlyq@ 已经在 BasicData.obj 中定义
warning C4727: 具有相同时间戳的名为 d:\nuroproj\winapp\proj\vs2008\makemapdata\makemapdata\release\makemapdata.pch 的 PCH 已存在于 d:\NuroProj\WinApp\proj\vs2008\MakeMapData\MakeMapData\Release\MakeDtm.obj 和 d:\NuroProj\WinApp\proj\vs2008\MakeMapData\MakeMapData\Release\Main.obj 中。使用第一个 PCH。

.\..\..\..\bin\MakeMapData\MakeMapData.exe : fatal error LNK1169: 找到一个或多个多重定义的符号
 
项目的debug和release下的预编译头设置看起来都一样。但是release下就是编译不过,还报以上的错误。
 
在网上看到网上有人提到:“工程属性里面设置的是使用哪个预编译头,但是预编译头的生成是在cpp文件的属性里面设置的,右键点击文件-属性-C/C++-预编译头,保证只有一个cpp文件会生成预编译头。
 
当时没怎么理解这句话的含义,不知道每个.cpp文件都可以设置预编译头。
 
后来通过对比正确版本、错误版本的.vcxproj文件,发现正确版本的文件 <ItemGroup>项下

<ClCompile Include="stdafx.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
</ClCompile>,

而错误版本的

<ClCompile Include="stdafx.cpp">
</ClCompile> 没有中间的两项预编译头子项。

然后查看有关预编译头的相关介绍,知道了原来每个.cpp源文件都可以单独设置预编译头选项(使用预编译头,还是创建编译头,或者不使用)

创建预编译头 Debug 正常 Release Link Error 处理方法

这个问题的原因是stdafx.cpp源文件的预编译头设置的选项问题。右键stdafx.cpp文件,选中属性

发现这里的预编译头选项是“使用”,然后把预编译头的使用改成“创建”,然后重新编译,编译通过了。

下面转一篇关于预编译头介绍的问题

预编译头就是将程序的头文件部分编译成一个二进制中间文件,提高整个工程的编译效率,一般以.pch格式存储。

1. 在编译器重已经采用了时间戳的方式,为何还需要预编头呢?

对.obj加以时间戳的方式,可以根据时间戳来决定哪些文件需要重新编译,从而提高效率。但重新编译这个文件,包括这个文件的头文件里的信息和预处理(指头文件中的预处理)都重新进行一遍,而预编译头正是解决了这个问题,将稳定的头文件内容预先编译为一个二进制中间文件。

2. 只有头文件如何编译呢?

        编译器无法直接编译头文件,那么就需要一个CPP和结合头文件一起编译,这样就是为什么通常MFC工程中存在一个StdAfx.cpp,其内容仅仅显示:
  1. // stdafx.cpp : 只包括标准包含文件的源文件
  2. // TurnRound.pch 将作为预编译头
  3. // stdafx.obj 将包含预编译类型信息
  4. #include "stdafx.h"

通常将常用的头文件都放到stdafx.h头文件中。

3. fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h" to your source?

在MFC中编程中最常见不过的了,因为MFC工程默认采用了预编译头,之后必须在.cpp文件头部包含stdafx.h(注意一定要放在头部,不然前面的头文件会被忽略);右击我们出错的的文件可以找到证据:

如果你关闭预编译头,可以发现没有了这个error。但既然预编译头带来这么多好处,为何不使用呢?

4. 创建属于自己的预编头(本人采用VS2005)

(1)第一步,创建stdafx.h 和 stdafx.cpp, 将常用的头文件放入stdafx.h中(一般选择稳定的头文件,因为编译产生预编译头时间比较长),在stdafx.cpp中添加代码

  1. #include "stdafx.h"

(2)第二步,右击工程属性=》配置属性=》c/c++ =》预编译头,选择使用预编头, "预编译头文件"项 填写 stdafx.h。

(3)第三步,右击stdafx.cpp文件 -》选中属性,配置属性=》c/c++ =》预编译头,选择创建预编译头,"预编译头文件"项 填写 stdafx.h。

vs2010 创建预编译头 Debug 正常 Release Link Error问题解决的更多相关文章

  1. 创建预编译头 Debug 正常 Release Link Error:预编译头已存在,使用第一个 PCH

    创建预编译头 Debug 正常 Release Link Error Main.obj : error LNK2005: ___@@_PchSym_@00@UmfilkilqUdrmzkkUkilqU ...

  2. vs2008 vc90.pdb 不是创建此预编译头时使用的 pdb 文件,请重新创建预编译头

    解决方案: 找到项目中的stdafx.cpp,右键属性,找到C/C++->预编译头, 设置为创建预编译头, 重新生成

  3. VS2010遇到fatal error C1083: 无法打开预编译头文件:“xxx.pch”: No such file or directory

    对C++和VS2010非常不熟悉,但是无奈赶着项目,只能看了点基础就上手,然后就碰到这个问题了. 原因分析: http://bbs.csdn.net/topics/340191697?page=1 编 ...

  4. fatal error C1083: 无法打开预编译头文件:“Debug\a.pch”:No such file or directory

    一.解决方法 右键点击你创建的项目,选择“属性标签”点击属性,弹出“项目属性页”,在左侧找到以下位置  配置属性 -->  C/C++  --> 预编译头,并选择它:在右边的菜单中选择 “ ...

  5. 2016-07-07: 重新编译时vc90.pdb不是创建此预编译头时使用的pdb文件

    使用VS2008在一个解决方案中包含多个项目时,当设置多个项目的中间目录为同一个目录时,在增量编译时出现"重新编译时vc90.pdb不是创建此预编译头时使用的pdb文件,请重新创建预编译头问 ...

  6. fatal error C1859: “Release\IWBServer.pch”意外的预编译头错误,只需重新运行编译器就可能修复此问题

    解决方案 1.    创建预编译头(/Yc)   -- >     stdafx.cpp    使用预编译头(/Yu) 2.    complie 3.    使用预编译头(/Yu)    -- ...

  7. fatal error C1854: 无法覆盖在创建对象文件.obj”的预编译头过程中形成的信息

    原因: 将stdafx.cpp 的预编译头属性  由 创建预编译头(/Yc) 改成了 使用预编译头(/Yu) 解决: 改回为 创建预编译头(/Yc) 参考文档 http://blog.csdn.net ...

  8. 预编译头文件 StdAfx.h

    预编译头文件: 最常见的使用场景就是 StdAfx.h 文件,在这个文件中包含常用的头文件,比如windows.h,cstdio,string,别的 .cpp 文件去包含 StdAfx.h 头文件.编 ...

  9. C++ 预编译头文件

    1.解决什么问题? C++ 编译器是单独,分别编译的,每个cpp文件,进行预编译(也就是对#include,define 等进行文本替换),生成编译单元.编译单元是一个自包含文件,C++编译器对编译单 ...

随机推荐

  1. python3-day1-python简介及入门

    python简介及入门 python简介 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为 ...

  2. linux 添加静态ip dns

    /etc/network 下:interfaces auto loiface lo inet loopbackauto eth0iface eth0 inet staticaddress 192.16 ...

  3. suspendlayout

    c# this.suspendlayout有什么作用 为了防止layout事件的发生.这个事件将引发重新绘图的事件,如果介面上控件较多的话,改变控件某些属性时,由于不断地重画,性能变低,所以用susp ...

  4. DNS错误 事件4000 4013

    DNS 错误事件4000 4013,无法创建活动目录本身的区域 WINDOWS 2003 DNS服务器无法解析 错误ID 4000 DNS 服务器无法打开 Active Directory.这台 DN ...

  5. codeforces 83 D. Numbers

    题意: 给出l,r,k,(1 ≤ l ≤ r ≤ 2·109, 2 ≤ k ≤ 2·109) 求在区间[l,r]内有多少个数i满足 k | i,且[2,k-1]的所有数都不可以被i整除 首先,如果k不 ...

  6. 关于ios使用jquery的on,委托事件失效

    $('.parents').on("click",'.child',function(){}); 类似上面这种,在ios上点击"child"元素不会起作用,解决 ...

  7. JDBC 数据库连接池 小结

    原文:http://www.cnblogs.com/lihuiyy/archive/2012/02/14/2351768.html 当对数据库的访问不是很频繁时,可以在每次访问数据库时建立一个连接,用 ...

  8. js实现的点击div区域外隐藏div区域(转)

    首先看下JS的事件模型,JS事件模型为向上冒泡,如onclick事件在某一DOM元素被触发后,事件将跟随节点向上传播,直到有click事件绑定在某一父节点上,如果没有将直至文档的根. 阻止冒泡: 1. ...

  9. HUD 4007 [扫描线][序]

    /* 大连热身B题 不要低头,不要放弃,不要气馁,不要慌张 题意: 坐标平面内给很多个点,放置一个边长为r的与坐标轴平行的正方形,问最多有多少个点在正方形内部. 思路: 按照x先排序,然后确定x在合法 ...

  10. Xcode 7 调试野指针利器 Address sanitizer

    Xcode 7 调试野指针利器 Address sanitizer 什么是Address Sanitizer? AddressSanitizer is a fast memory error dete ...