C++ 带有GCC的预编译头

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时成功获得预编译头吗?我在我的尝试中没有运气,我也没有看到很多关于如何设置它的好例子。我曾在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
....