C++ visualc&x2B+;预编译头错误

C++ visualc&x2B+;预编译头错误,c++,visual-studio,visual-c++,header,precompiled-headers,C++,Visual Studio,Visual C++,Header,Precompiled Headers,更新: 在头文件中包含stdafx.h有什么影响 我在Linux /Eclipse CDT上启动了一个C++项目,并将其导入Visual C++/Windows中。p> 在VisualC++中,我开始使用预编译头文件加快编译并定义了STDAFX.CPP和STDAFX.H. 这是我的stdafx.h #pragma once #include <string> #include <vector> #include <map> ... 在每个.h和.cpp文

更新:

在头文件中包含stdafx.h有什么影响


我在Linux /Eclipse CDT上启动了一个C++项目,并将其导入Visual C++/Windows中。p> 在VisualC++中,我开始使用预编译头文件加快编译并定义了STDAFX.CPP和STDAFX.H. 这是我的stdafx.h

#pragma once

#include <string>
#include <vector>
#include <map>
...
在每个.h和.cpp文件中,我都有以下内容:

#pragma once //if in a header file
#include "stdafx.h"
对于发行版和调试版,我都有“创建预编译头(/Yc)”。它在调试模式下编译得很好,但在发布模式下它会继续报告

error LNK2005: ___@@_PchSym_@00@UfhvihUaszlaDUwlxfnvmghUnnlUhixUnnlPeDUnnlPeDUivovzhvUvmgrgbOlyq@ already defined in A.obj
如果我将两者都切换到“使用预编译头”,我将同时进入调试和发布

fatal error C1854: cannot overwrite information formed during creation of the precompiled header in object file:
有人知道发生了什么吗?

您将
#pragma once
放在
#include“stdafx.h”
之前,我认为这会导致编译器忽略
#pragma once
指令


另外,我认为您根本不应该将
#include“stdafx.h”
行放在头文件中。

您只为stdafx.cpp放了“create precompiled header”。然后对所有其他“.cpp”文件“使用预编译头”。最后,让
在每个.cpp”文件的开头包含“stdafx.h”
(通常不在头文件中)。
编译器选项用于为编译操作创建预编译头。
/Yu
选项指示编译器使用预编译头

您将始终在项目设置中使用
/Yu
选项。 在
stdafx.cpp
文件的属性页中,将设置
/Yc
选项

必须了解,每个
.cpp
文件都有单独的编译选项


有关/Y选项的详细信息,请参见。

使用“stdafx.h”的结果不受预编译头系统的影响。如果禁用“创建PCH/使用PCH”,代码将编译并创建相同的输出,只是速度较慢。这也是为什么可以在可移植代码中使用它(与
#pragma once
不同)

顺便说一下,我创建了一个新的测试项目,并将其PCH设置与我的进行了比较。它的设置是使用PCH。该项目以某种方式编译得很好。是的,您通常会将#include“stdafx.h”作为每个.cpp文件的第一个include。我认为它实际上可能必须是第一个非注释行。因此,基本上我必须在PCH中包含我自己的头文件?那么编译头文件的代价(boost)呢在我自己的头中引用?例如,如果我在stdafx和my_class.h中都引用Boost,在my_class.cpp中,将跳过my_class.h中引用的Boost,因为stdafx已经引用了它?即使头必须包含在其他地方,也只需要在预编译的基础上进行一些处理。在PCH为了最大限度地减少处理,您将在其他位置包含头以提供类型信息和定义构造。这些包含用于不同的目的。虽然此答案指出了一些问题,但实际上并没有回答链接器错误的问题。我只能设置配置范围的Create PCH或Use PCH。在VS中,您可以右键单击clic然后在“C++->Precompiled headers”下,您可以将该值设置为“create”或“use”。配置范围的设置用作默认值-您可能应该将其设置为“use”,然后为stdafx.cpp覆盖它。那么在头文件中包含stdafx.h会有什么影响呢?实际上没有任何影响,因为头本身并不定义可编译单元,它们只是其他可编译单元的一部分。我知道这是一个老问题,但我对“头文件中通常不包含”感到困惑part.你是说要定期包含所有必要的文件,例如.h和example.cpp应该包含预编译头和example.h?这难道不意味着example.h中包含的文件要编译两次吗?一次在pch中,一次在example.h中?
fatal error C1854: cannot overwrite information formed during creation of the precompiled header in object file: