Visual C ++预编译标头错误

时间:2009-09-09 01:49:43

标签: c++ visual-studio visual-c++ header precompiled-headers

更新

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


我开始使用Linux / Eclipse CDT中的C ++项目并将其导入Visual C ++ / Windows。

在Visual C ++中,我开始使用预编译头来加速编译,并定义了stdafx.cpp和stdafx.h。

这是我的stdafx.h

#pragma once

#include <string>
#include <vector>
#include <map>
...

和我的stdafx.cpp

#include "stdafx.h"

在每个.h和.cpp文件中,我都有以下内容:

#pragma once //if in a header file
#include "stdafx.h"

对于发布和调试,我都有“创建预编译头(/ Yc)”。它在调试模式下编译良好,但在发布模式下它会继续报告

error LNK2005: ___@@_PchSym_@00@UfhvihUaszlaDUwlxfnvmghUnnlUhixUnnlPeDUnnlPeDUivovzhvUvmgrgbOlyq@ already defined in A.obj

如果我同时切换到“使用预编译头”,我会进入Debug和Release

fatal error C1854: cannot overwrite information formed during creation of the precompiled header in object file:

有谁知道发生了什么事?

4 个答案:

答案 0 :(得分:30)

您只为stdafx.cpp添加“create precompiled header”。然后为所有其他“.cpp”文件“使用预编译头”。最后,在每个“.cpp”文件的开头都有include "stdafx.h"(通常不在头文件中。

答案 1 :(得分:6)

/Yc编译器选项用于为编译操作创建预编译头。 /Yu选项指示编译器使用预编译的头。

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

重要的是要了解每个.cpp文件都有单独的编译选项

有关/ Y选项的详细信息,请参阅here

答案 2 :(得分:4)

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

另外,我认为你根本不应该将#include "stdafx.h"行放入头文件中。

答案 3 :(得分:1)

使用“stdafx.h”的结果不受PreCompiled Header系统的影响。如果关闭Create PCH / Use PCH,代码将编译并创建相同的输出,但速度较慢。这也是您可以在便携式代码中使用它的原因(与#pragma once不同)