C++ 带有GCC的预编译头
有人在使用GCC时成功获得预编译头吗?我在我的尝试中没有运气,我也没有看到很多关于如何设置它的好例子。我曾在cygwin gcc 3.4.4上试用过,并在Ubuntu上使用过4.0。我过去曾尝试过一次在gcc下使用预编译头,我记得当时也遇到过问题。需要记住的是,如果不满足某些条件,gcc将忽略该文件(header.h.gch或类似文件),可以在上找到该文件的列表 通常,让构建系统编译.gch文件作为第一步是最安全的,使用与源代码其余部分相同的命令行选项和可执行文件。这样可以确保文件是最新的,并且没有细微的差异C++ 带有GCC的预编译头,c++,gcc,precompiled-headers,C++,Gcc,Precompiled Headers,有人在使用GCC时成功获得预编译头吗?我在我的尝试中没有运气,我也没有看到很多关于如何设置它的好例子。我曾在cygwin gcc 3.4.4上试用过,并在Ubuntu上使用过4.0。我过去曾尝试过一次在gcc下使用预编译头,我记得当时也遇到过问题。需要记住的是,如果不满足某些条件,gcc将忽略该文件(header.h.gch或类似文件),可以在上找到该文件的列表 通常,让构建系统编译.gch文件作为第一步是最安全的,使用与源代码其余部分相同的命令行选项和可执行文件。这样可以确保文件是最新的,并且
首先使用一个精心设计的示例可能也是一个好主意,只是为了消除您的问题特定于项目中的源代码的可能性。调用gcc的方式与调用源文件的方式相同,但使用头文件 e、 g 这将生成一个名为test.h.gch的文件 每次gcc搜索test.h时,它首先查找test.h.gch,如果找到它,它会自动使用它 更多信息可在下找到 您可以像编译任何其他文件一样编译头文件,但将输出放在后缀为
.gch
的文件中
因此,例如,如果您预编译stdafx.h,您将有一个预编译头,它将在任何时候包含stdafx.h
时自动搜索调用的stdafx.h.gch
例如:
stdafx.h:
#include <string>
#include <stdio.h>
然后编译为:
>g++-c stdafx.h-o stdafx.h.gch
>g++a.cpp
./a.out
即使在第1步之后删除stdafx.h,您的编译也会工作。我肯定已经成功了。首先,我使用了以下代码:
#include <boost/xpressive/xpressive.hpp>
#include <iostream>
using namespace std;
using namespace boost::xpressive;
//A simple regex test
int main()
{
std::string hello( "hello world!" );
sregex rex = sregex::compile( "(\\w+) (\\w+)!" );
smatch what;
if( regex_match( hello, what, rex ) )
{
std::cout << what[0] << '\n'; // whole match
std::cout << what[1] << '\n'; // first capture
std::cout << what[2] << '\n'; // second capture
}
return 0;
}
这个!表示编译器能够使用预编译头。x表示它无法使用它。使用适当的编译器标志是至关重要的。我取下了-H并进行了一些速度测试。预编译头从14秒提高到11秒。不错,但不太好
注意:下面是示例的链接:我无法在帖子中使用它
顺便说一句:我正在使用下面的g++
< C++ >代码> G+(Ubuntu 4.4.3-4Ubuntu5)4.4.3 < /P> < P> C++ C++预编译头的<代码> -X/COD>指定符为:代码> -XC++-页眉< /代码>,而不是<代码> -XC++。PCH的示例用法如下
pch.h
:
// Put your common include files here: Boost, STL as well as your project's headers.
main.cpp
:
#include "pch.h"
// Use the PCH here.
按如下方式生成PCH:
$g++-xc++-header-opch.h.gch-cpch.h
pch.h.gch
必须与pch.h
位于同一目录中才能使用,因此请确保从pch.h
所在的目录执行上述命令。确保-包括您的\u头.h
这就是我如何预编译和使用bits/stdc++.h集合的方法
代码
我看到的地方
. /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h
因此,我在当前目录中创建了一个新目录bits
,并从中复制了stdc++.h
然后我跑了
g++ bits/stdc++.h -O3 -std=c++14 -pthread
它生成了bits/stdc++.gch
通常我通过
g++ sol.cpp -O3 -pthread -lm -std=c++14 -o executable
,但我不得不将其修改为
g++ sol.cpp -include bits/stdc++.h -O3 -pthread -lm -std=c++14 -o executable
由于它只解析为.gch
文件,而不是.h
与-include bits/stdc++.h
这是我的关键。要记住的另一件事是编译*.h
头文件时必须使用与编译*.cpp
几乎相同的参数。当我没有包含-O3
或-pthread
时,它忽略了*.gch
预编译头
为了检查是否一切正常,您可以通过比较
time g++ sol.cpp ...
或运行
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
再次查找标题路径,如果您现在得到例如,代码>在库路径之前
! ./bits/stdc++.h.gch
....
关于文件扩展名的一个微妙提示让我大吃一惊,因为我没有注意到:.gch
扩展名被添加到预编译文件的全名中,它不会取代.h
。如果您弄错了,编译器将无法找到它,并且无法正常工作
precomp.h=>precomp.h.gch
不是:
预压缩.h=>预压缩。gch
使用GCC <代码> -h >代码>检查是否使用它。< /P>我使用GCC 3.4,并且行G++STDAFX.H不编译,您得到错误“g++:请求头文件的编译”,但这将编译,但不确定这是否是我想要的:“g++-C++ x+sdfAFx.H-o STDAFX.H.PCH”。我试过了,我得到了预编译头的最佳用例,因为我的c源代码是编译器生成的,而不是用户编写的。Sun Studio,尤其是Visual Studio,大大提高了构建时间。在gcc上,如果没有预编译头,情况会变得更糟。这是3.4版的,还没有用4.x测试,但是速度和gcc是互斥的。@Lothar代码是什么?我发现G++比最近的VisualStudio编译器快10倍,在一些重模板代码中。我在C++代码中不使用模板。这只是C++异常处理+漂亮的C++扩展。即使在这个问题提出6年后的今天,VS2010的速度也快了一个数量级。但与此同时,我有16个内核,因此我可以使用它。添加-Winvalid pch将帮助您调试pch的使用是否出现问题以及为什么会出现问题。当您有许多彼此重新链接的头时,“不坏但不好”预编译头非常有用,因此,他们将减少使用大型库或许多库的大型项目的编译时间。“不错但不太好”:使用GCC4.4.7136.cpp文件总大小35.5 Mb,148.h文件总大小5.5 Mb,.gch文件为48 Mb,调试构建需要2'20”(vs 2'14“非pch),-O2优化构建需要4'30”(vs 5'33“非pch)这种效果在调试构建附近是可以预期的,但它是绝对的
g++ sol.cpp -O3 -pthread -lm -std=c++14 -o executable
g++ sol.cpp -include bits/stdc++.h -O3 -pthread -lm -std=c++14 -o executable
time g++ sol.cpp ...
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
! ./bits/stdc++.h.gch
....