问题标签 [precompiled-headers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1221 浏览

c++ - Visual C++ Linking LNK2019 Error with a Precompiled Header

我对预编译头有一个非常奇怪的问题。当我在 .cpp 文件中实现方法时,链接器生成 LNK2019: unresolved external symbol 错误。但是,如果我在 .h 文件中实现方法,则可以编译程序。我碰巧找到了解决方案,但我不知道这个错误的根本原因。

我的项目结构是这样的

解决方案
-> 项目 1
-> 项目 2

项目 1 有 3 个文件。啊,A.cpp 和 stdafx.h

在项目 2 中。我想使用 A 类。

文件whatever.cpp

在编译时,链接器报告 A 构造函数的未解决的外部符号错误。如果我在 Ah 文件中实现构造函数。project2 可以成功编译。我想知道,为什么不能把实现放在 A.cpp 文件中?组织预编译头文件的正确方法是什么?

谢谢

0 投票
2 回答
2369 浏览

c++ - SCons、Boost::ASIO、Windows 预编译头文件和链接器错误

当我们为多个平台开发 C++ 时,我正在研究将 SCons 用于我们的构建过程。我在构建配置中已经完成了 99% 的工作,但是我在 Windows 上遇到了一个非常奇怪的错误,与预编译的头文件有关。更奇怪的是,它只发生在一个项目上。

在这个项目的 SConscript 文件中,我有以下在 windows 上编译 PCH:

我还设置了一个编译器标志来强制在项目中的所有文件中包含 MyPCH.h:

一切顺利,编译得非常好。直到最后的 DLL 链接阶段,我才得到链接器错误的页面和页面,如下所示:

和:

这令人费解,因为我收到链接警告的所有类都没有使用 boost::asio,尽管它包含在预编译的头文件中并在某些#includes 中向上链。

更令人费解的是,如果我禁用预编译头文件的编译,但仍然强制它包含,一切编译和链接就好了。它只需要永远吓坏。

有没有人知道可能导致这些链接器错误的原因?

提前致谢。

- - 编辑 - -

这是 SCons 为构建 PCH(减去包含路径)而吐出的命令行:

这是正在编译的文件的命令行(再次减去包含路径):

最后,这是链接命令行:

此外,PCH 标头并未明确包含在每个单独的文件中,但在命令行选项中,我有 /FI 强制将 PCH 包含在项目中编译的每个文件中。

0 投票
4 回答
3236 浏览

c++ - MSVC 预编译头文件:哪些文件需要#include "stdafx.h"?

#include "stdafx.h"使用预编译头文件时是否每个文件都需要?或者只有源文件需要包含它。

编辑:另外,我的预编译头文件#includes有很多 STL 头文件。但是,在我的标题中,有时我有返回的函数std::vector或类似的东西,所以#include <vector>无论如何我都需要。这比包含 stdafx.h 更糟糕吗?我需要包含我的单元测试框架的定义。

0 投票
1 回答
412 浏览

c++ - 使用预编译头文件重构项目中某些文件的依赖关系会导致链接器错误

我正在使用 MSVC++ 6 构建一个非常大的项目。该项目中的一些源文件与我们用于维护应用程序的小实用程序共享。以前,这个小实用程序需要链接主应用程序中的许多库,并且在运行时还需要主应用程序的 DLL。我的任务是删除这些依赖项,这听起来很简单……不幸的是,主应用程序中使用的预编译头给我带来了很多麻烦。

我首先修改了实用程序中的所有文件以明确包含他们需要的所有内容,然后删除了 PCH 的#include 指令(这删除了实用程序 95% 的不必要依赖项)。这对于编译实用程序非常有用。然而,现在,编译主应用程序给了我关于缺少预编译头指令的错误。我想“太好了,我将有条件地包括 PCH”。这似乎不起作用......我得到“意外的#endif”,如此所述。我的下一个想法是在主应用程序中关闭在实用程序和主应用程序之间共享的三个源文件的 PCH。这编译成功,但我在链接过程中收到一堆看起来像这样的错误:

AFAICT,所有多重定义的符号都是我明确包含在共享文件中的符号,以避免对 PCH 的需要。我的预感是,由于我将这 3 个文件链接到与 PCH .cpp 文件相同的 DLL 中,因此它们在多个位置编译。有没有办法摆脱这种混乱?我会尝试任何事情...

0 投票
2 回答
1802 浏览

c++-cli - C++ / CLI 预编译头文件:它们是如何工作的?

我正在尝试编写一个混合模式 DLL,我们称之为“客户端”,以用它们的托管等效项替换一些非托管类。在我的个人机器上一切正常,但是当我签入源代码时,我们的构建机器不会构建项目。它无法识别我在另一个名为“Core”的 DLL 中使用的托管类。

我认为这个问题与预编译的头文件有关。原因如下:

为了使用“Core”中的类,我在“Client”项目中添加了对“Core”项目的引用。如果我删除此引用,然后在我的个人计算机上构建项目,它仍然可以工作。但是,CLR PCH 在删除引用后不会重新编译。如果我重新编译 CLR PCH,然后编译项目,它会失败并出现与构建机器上相同的错误:无法识别托管类。

在我看来,您导入的 DLL 中的托管类是在预编译头文件中定义的。我无法验证这一点,但这是我最好的猜测。有没有人对这个问题有任何见解?混合 DLL 中的项目引用是否通过将挂钩放入托管 PCH 来解决?

重现步骤

以下对我来说毫无意义:

  1. 获取客户端构建。
  2. 删除从客户端到核心的引用。编译客户端。客户端仍在构建。这不是预期的。
  3. 重新编译Client PCH,然后编译Client。编译客户端失败:“核心”中的类未定义。这是预期的行为。
  4. 添加对Core的引用,编译。由于同样的原因,编译客户端失败。这不是预期的
  5. 重新编译Client PCH,然后编译Client。客户端编译良好。

我从这个实验中得出的结论是,引用是通过预编译的头文件插入到项目中的,并且它的工作方式有些问题,至少在我们的构建机器上是这样。

0 投票
7 回答
10474 浏览

c++ - 预编译头文件?我们真的需要它们吗

很久以前,我曾经使用预编译的头文件:a。加速编译和 b. 因为我支持多种开发工具,如 CodeWarrior、MPW、VS、ProjectBuilder、gcc、intel 编译器等。

现在我有一台 32GB 内存的 Mac Pro。

现在我只使用 CMake。

那么我们真的需要预编译的头文件了吗?

有没有我看不到/不知道的明显好处?

如何制作跨平台的预编译头文件?也许这也会简化我的生活。

0 投票
3 回答
443 浏览

c++ - 关于预编译头的小问题

查看一个开源代码库,我遇到了这段代码:

现在 StableHeaders.h 是一个预编译的头文件,它包含在“控制”cpp 中以强制生成它。无论如何,在预编译头之后出现的三个包含也包含在 StableHeaders.h 文件中。我的问题是,这些文件是否包含两次,以便代码库构建在不支持预编译头文件的编译器上?正如我假设包含警卫/标头缓存将使多个包含冗余无论如何...

顺便说一句, stableheaders.h文件对 win32 进行了检查(大致),所以我再次假设 stableheaders.h 中的包含不会包含在不支持预编译头文件的编译器中。

0 投票
3 回答
19425 浏览

visual-studio-2008 - 预编译头文件

我有一个 Visual C++ 6 中的示例项目(不是我的)。我正在尝试将其转换为 Visual Studio 2008。

较旧的项目使用预编译的头文件。现在的问题是:

  1. 什么是预编译头文件?

  2. 由于旧项目使用的是预编译头文件。我还将在 Visual Studio 2008(新项目)中使用它们。但是我收到错误消息说“您忘记包含 stdafx.h”,为了解决这个问题,我在每个源文件中都包含“stdafx.h”。那工作得很好。但是旧项目没有在每个文件中都包含“stdafx.h”?那么我如何选择退出在每个源文件中包含“stdafx.h”。因为不是每个源文件都需要“stdafx.h”中定义的包含文件,所以只有少数需要。这是怎么做的?

编辑: 我如何从使用预编译头文件中排除某些文件?

0 投票
1 回答
728 浏览

c++ - 关于 Visual C++ 中预编译头的问题

如果我将一个标头 (ah) 放入 stdafx.h 并且该标头包含另一个在 stdafx.h 中未提及的标头 (bh),那么每次有人包含 ah 时都会访问 bh 还是将其编译为 ah 的一部分?如果编译成ah,直接包含bh会怎样?这会被预编译吗?

我提出这个问题的动机是我正在尝试为我正在使用的软件优化 stdafx.h 文件的内容。重建和增量构建时间对我们都很重要。我想知道是否可以简单地在所有 .cpp 文件中搜索#include 指令并计算每个文件被包含的次数。经常包含的文件可能是 stdafx.h 文件的良好候选者。当然,如果我不仅要考虑包含哪些文件,还要考虑包含的文件包含哪些文件,那么这种策略完全是假的。

我怀疑这很重要,但我们使用的是 Visual Studio 2005。

0 投票
6 回答
7032 浏览

c++ - 特别是在 GNU/Linux 环境/工具链中的预编译头文件的优缺点是什么?

预编译的头文件似乎可以在大型项目中节省大量时间,但也似乎是一个有一些陷阱的麻烦事。

使用预编译头文件的优缺点是什么,特别是与在 Gnu/gcc/Linux 环境中使用它们有关?