我有一个框架,正在被几个项目使用(其中包括几个示例以显示框架是如何工作的).该框架具有核心,图形,物理,gui等组件.每个组件都是一个单独的库.有几种配置.
主解决方案文件使用所有可能的配置编译整个项目,以便项目可以使用库.由于框架很少被重新编译,特别是由某人(包括我)处理使用该框架的项目,因此预编译许多标头是有意义的.
最初我让每个项目/样本都有自己的预编译头,用于整个项目.每次我必须重建相同的pch(例如,Debug),所以我决定共享PCH将减少冗余PCH编译.到现在为止还挺好.我有一个项目,编译PCH和库.所有后续项目/样本现在都使用相同的PCH.这非常有效.
唯一的问题是我看到文件大小增加.这不是障碍,就好像要发布使用该框架的项目一样,它可以将自己从共享的PCH中切断并自行创建.我这样做是为了快速开发(我实际上已经创建了一个工具,可以为新项目/样本创建VS项目文件和源文件,以便于构建以及升级以前使用旧版本的项目框架的版本).
无论如何,(我假设)文件大小的增加是因为创建共享PCH的独立VS项目文件包括来自所有库的所有头文件.我的问题是我是否可以使用条件编译(#ifndef)来减少最终可执行文件的大小?或者也许以某种方式共享多个PCH文件(据我所知,这是不可能的,但我可能错了)如果我没有意义,请说出来(实际上是:))因为我对PCH文件的了解非常有限.
谢谢!
注意:为了重新迭代并清楚地说明,到目前为止,我有一个解决方案文件正在编译包括共享PCH在内的所有库.现在,如果我重新编译所有示例和项目,它们最多可以在几秒或更长时间内编译.之前,每个项目都会重新创建一个PCH文件.另外,最初我想为每个库提供PCH,但后来我发现源文件不能使用多个PCH文件,所以这个选项不可行.另一个选择是编译PCH文件的所有可能组合,但这太耗时,麻烦且容易出错.
我不小心删除了一个我没有添加到版本控制的.h文件,但我仍然有.h.gch.有什么方法可以解压缩.gch吗?
我们在项目中使用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) 我使用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是否支持进行此类测试?
也许我可以用另一种方式实现我想要的东西?
我们使用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 ++文件所需的.pch文件.我使用Android NDK从几个c ++文件中创建一个库,然后在我的Java程序中使用它来调用库函数.任何人都可以告诉如何或在哪里包含.pch文件,以便编译器可以识别它.
我正在开发VS 2012中的VC++项目,整个编译大约需要8-10分钟.我知道PCH可以将编译时间提高10倍.我目前在我的项目中禁用了PCH,并且我将头文件包含在需要它们的位置.我如何开始使用PCH?我到处寻找"如何"指南,但我得到的只是文档.
我假设我必须:
.cpp文件中收集标头并将其放入PCH头文件中我如何开始这个(特别是#1)?您是否修改了使用PCH的项目以及其中的绊脚石或常见问题/问题?PCH会导致任何问题,还是与正常包含的编译时/运行时行为相同?有没有一个自动化过程的工具,或者我必须手动通过500个.cpp文件并修改它以使用PCH?
最后但并非最不重要的是,PCH可以期待的编译时间加速是多少?是2x-10x?或者它会快30%?(这不能证明所涉及的时间)
我理解预编译的头文件正在使用"#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
我正在尝试构建一个预编译的标头和一个可执行文件,如下所示:
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) 我的 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++ ×6
gcc ×3
android ×1
android-ndk ×1
build ×1
build-time ×1
c ×1
compilation ×1
g++ ×1
gnu-make ×1
linker ×1
macos ×1
pch ×1
stdafx.h ×1
visual-c++ ×1
x86-64 ×1