标签: precompiled-headers

有效地共享预编译的标题

我有一个框架,正在被几个项目使用(其中包括几个示例以显示框架是如何工作的).该框架具有核心,图形,物理,gui等组件.每个组件都是一个单独的库.有几种配置.

主解决方案文件使用所有可能的配置编译整个项目,以便项目可以使用库.由于框架很少被重新编译,特别是由某人(包括我)处理使用该框架的项目,因此预编译许多标头是有意义的.

最初我让每个项目/样本都有自己的预编译头,用于整个项目.每次我必须重建相同的pch(例如,Debug),所以我决定共享PCH将减少冗余PCH编译.到现在为止还挺好.我有一个项目,编译PCH和库.所有后续项目/样本现在都使用相同的PCH.这非常有效.

唯一的问题是我看到文件大小增加.这不是障碍,就好像要发布使用该框架的项目一样,它可以将自己从共享的PCH中切断并自行创建.我这样做是为了快速开发(我实际上已经创建了一个工具,可以为新项目/样本创建VS项目文件和源文件,以便于构建以及升级以前使用旧版本的项目框架的版本).

无论如何,(我假设)文件大小的增加是因为创建共享PCH的独立VS项目文件包括来自所有库的所有头文件.我的问题是我是否可以使用条件编译(#ifndef)来减少最终可执行文件的大小?或者也许以某种方式共享多个PCH文件(据我所知,这是不可能的,但我可能错了)如果我没有意义,请说出来(实际上是:))因为我对PCH文件的了解非常有限.

谢谢!

注意:为了重新迭代并清楚地说明,到目前为止,我有一个解决方案文件正在编译包括共享PCH在内的所有库.现在,如果我重新编译所有示例和项目,它们最多可以在几秒或更长时间内编译.之前,每个项目都会重新创建一个PCH文件.另外,最初我想为每个库提供PCH,但后来我发现源文件不能使用多个PCH文件,所以这个选项不可行.另一个选择是编译PCH文件的所有可能组合,但这太耗时,麻烦且容易出错.

c++ precompiled-headers visual-studio-2008

9
推荐指数
1
解决办法
2063
查看次数

取消编译gch文件

我不小心删除了一个我没有添加到版本控制的.h文件,但我仍然有.h.gch.有什么方法可以解压缩.gch吗?

c gcc precompiled-headers

9
推荐指数
1
解决办法
843
查看次数

在OSX上预编译的头文件和编译通用对象

我们在项目中使用GCC预编译头文件,并按如下方式构建它们:

gcc $(CFLAGS) precompiledcommonlib.h
Run Code Online (Sandbox Code Playgroud)

现在我正在OSX 10.6上构建项目,并尝试同时使用为所有体系结构构建的漂亮功能,如下所示:

gcc $(CFLAGS) -c -arch i386 -arch x86_64 commonlib.c  
Run Code Online (Sandbox Code Playgroud)

但是,似乎这对预编译的头文件不起作用:

gcc $(CFLAGS) -arch i386 -arch x86_64 precompiledcommonlib.h
Undefined symbols for architecture i386:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
lipo: can't open input file: /var/folders/z1/z1A0sPkqGDyPrZWo9ysVK++++TI/-Tmp-//cc3W2gwd.out (No such file or …
Run Code Online (Sandbox Code Playgroud)

macos gcc x86-64 precompiled-headers

8
推荐指数
1
解决办法
2万
查看次数

使用GNU make创建几个预编译的头文件

我使用gcc(运行as g++)和GNU make.我使用gcc预编译头文件precompiled.h,创建precompiled.h.gch; Makefile中的以下行执行此操作:

# MYCCFLAGS is a list of command-line parameters, e.g. -g -O2 -DNDEBUG
precompiled.h.gch: precompiled.h
    g++ $(MYCCFLAGS) -c $< -o $@
Run Code Online (Sandbox Code Playgroud)

一切都很好,直到我不得不运行g++不同的命令行参数.在这种情况下,即使precompiled.h.gch存在,也无法使用,编译速度会慢得多.在gcc文档中,我已经读过要处理这种情况,我必须创建一个目录precompiled.h.gch并将预编译的头文件放在那里,每个g++命令行参数都有一个文件.

所以现在我想知道我应该如何改变我的Makefile以告诉我用g++这种方式创建gch文件.也许我可以运行g++只是为了测试它是否可以使用precompiled.h.gch目录中的任何现有文件,如果没有,则生成具有唯一文件名的新预编译头.

gcc是否支持进行此类测试?

也许我可以用另一种方式实现我想要的东西?

c++ gcc gnu-make precompiled-headers

8
推荐指数
1
解决办法
2958
查看次数

如何有效地使用预编译头文件(使用/ Yc和Yu选项)?

我们使用Visual Studio 2003(VC71)进行编译.为了减少编译时间,我们更改了构建脚本,以便为每个CPP文件生成预编译头文件(.pch).

makefile中使用的选项:

/Yc"StdAfx.h"
/Fp"StdAfx.pch"
Run Code Online (Sandbox Code Playgroud)

这样,目标的编译时间减少了30%.但是,任何人都可以帮助我理解即使每次编译每个CPP文件时生成pch文件,它如何减少编译时间.

还有,这是正确的方法吗?我们应该使用Yc和Yu组合吗?我不能使用/ Yu选项,因为pch文件应该至少生成一次.

c++ build precompiled-headers visual-studio

8
推荐指数
1
解决办法
8900
查看次数

如何在Android NDK中使用预编译的头文件

我有一个编译c ++文件所需的.pch文件.我使用Android NDK从几个c ++文件中创建一个库,然后在我的Java程序中使用它来调用库函数.任何人都可以告诉如何或在哪里包含.pch文件,以便编译器可以识别它.

android precompiled-headers android-ndk

8
推荐指数
1
解决办法
2539
查看次数

在VC++项目中开始使用PCH

我正在开发VS 2012中的VC++项目,整个编译大约需要8-10分钟.我知道PCH可以将编译时间提高10倍.我目前在我的项目中禁用了PCH,并且我将头文件包含在需要它们的位置.我如何开始使用PCH?我到处寻找"如何"指南,但我得到的只是文档.

我假设我必须:

  1. 为PCH配置我的项目,创建一个空白的PCH头文件
  2. 从每个.cpp文件中收集标头并将其放入PCH头文件中
  3. 修改删除所有标头导入的每个文件
  4. 重新编译并希望没有出错;)

我如何开始这个(特别是#1)?您是否修改了使用PCH的项目以及其中的绊脚石或常见问题/问题?PCH会导致任何问题,还是与正常包含的编译时/运行时行为相同?有没有一个自动化过程的工具,或者我必须手动通过500个.cpp文件并修改它以使用PCH?

最后但并非最不重要的是,PCH可以期待的编译时间加速是多少?是2x-10x?或者它会快30%?(这不能证明所涉及的时间)

c++ compilation precompiled-headers visual-c++

8
推荐指数
1
解决办法
2989
查看次数

为什么Visual Studio C++甚至需要在不需要它的文件中包含"StdAfx.h"?

我理解预编译的头文件正在使用"#include"StdAfx.h"并且是的,我知道我可以关闭它们.但这不是我的问题.

如果您使用预编译头文件,Visual C++要求每个 cpp文件#include"StdAfx.h",甚至是不使用StdAfx.h中任何头文件的文件.如果您忘记在一个文件中包含StdAfx.h,则会出错.但为什么?显而易见的方法就是"如果你包含StdAfx.h,那么该文件将使用它,但如果你忘记包含它,那么这些头文件就不会被包含在内." 我不明白为什么VC++会要求你在不需要的时候包含StdAfx.h.似乎它们更容易像普通的头文件一样对待它.

有什么理由需要这个吗?

c++ precompiled-headers stdafx.h visual-studio-2012 visual-studio-2015

8
推荐指数
2
解决办法
6613
查看次数

为什么g ++找不到-I include-path中的预编译头?

我正在尝试构建一个预编译的标头和一个可执行文件,如下所示:

g++ -g -Wall -std=c++17 \
    -c ./src/pch.hpp -o ./build/pch.hpp.gch

g++ -g -Wall -std=c++17 \
        -c ./src/*.cpp  \
        -I./build/ -include pch.hpp
Run Code Online (Sandbox Code Playgroud)

pch.hpp.gch文件被正确地创建。但是对于每个.cpp文件,我都会收到以下错误:

1 error generated.
<built-in>:1:10: fatal error: 'pch.hpp' file not found
#include "pch.hpp"
Run Code Online (Sandbox Code Playgroud)

我认为根据gcc Precompiled Headers文档,我的编译行是正确的:

  • -I./build/告诉它将build目录添加到include搜索路径。
  • -include pch.hpp#include <pch.hpp>每个文件前添加指令。
  • 编译器.gch为其每个#include指令搜索带后缀的预编译头。

为什么我的编译行无法按预期运行?


我尝试过的某些方法确实可以给我带来更好的结果,但对我来说看起来并不正确。

如果我修改include来搜索.gch文件,则会找到该文件,与我期望的一致。即-include pch.hpp.gch,而不是-include pch.hpp
但是随后,PCH被解释为二进制文件,并且编译失败:

g++ -g -Wall -std=c++17 \
        -c ./src/*.cpp  \
        -I./build/ …
Run Code Online (Sandbox Code Playgroud)

g++ precompiled-headers pch

8
推荐指数
1
解决办法
211
查看次数

预编译 C++ 头文件是否会减慢链接时间?

我的 externalFiles 目录中有 100 个 .h 文件。我的源代码中大约有 10 个 .cpp 文件包含这些 .h 文件。

因此,我#include externalFiles/.*h从 .cpp 文件中删除了所有指令,并将它们写入通过 Cmake 包含的 pch.h 标头中target_precompile_headers(${PROJECT_NAME} PRIVATE pch.h)

通过 Cmake 使用预编译头检查了构建时间,而不是简单地将 pch.h 包含在我的 .cpp 文件中。我使用以下方法记录了构建时间: set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CMAKE_COMMAND} -E time")set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CMAKE_COMMAND} -E time")

使用预编译头构建时间

[1/2] 构建 CXX 对象 CMakeFiles/AlgoCoding.dir/main.cpp.obj

经过时间:11 秒。(时间),11.413 秒。(钟)

[2/2] 链接 CXX 可执行文件 AlgoCoding.exe

经过时间:54 秒。(时间),53.459 秒。(钟)

构建时间仅包括标头

[1/2] 构建 CXX 对象 CMakeFiles/AlgoCoding.dir/main.cpp.obj

经过时间:14秒。(时间),13.35 秒。(钟)

[2/2] 链接 CXX 可执行文件 …

c++ linker precompiled-headers build-time

8
推荐指数
1
解决办法
607
查看次数