关于c ++:带有GCC的预编译头文件

关于c ++:带有GCC的预编译头文件

Precompiled headers with GCC

任何人都可以使用GCC预编译头文件取得成功吗? 我的尝试没有运气,我也没有看到很多关于如何设置它的好例子。 我已经尝试过cygwin gcc 3.4.4,并在Ubuntu上使用4.0。


我绝对有成功。首先,我使用以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#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] << '
'
; // whole match
        std::cout << what[1] << '
'
; // first capture
        std::cout << what[2] << '
'
; // second capture
    }
    return 0;
}

这只是Boost Xpressive的一个问候世界(请参阅下面的链接)。首先,我在gcc中使用-H选项进行了编译。它显示了它使用的大量头文件列表。然后,我查看了我的IDE(code :: blocks)正在生成的编译标志,并看到了类似的内容:

g++ -Wall -fexceptions -g -c main.cpp -o obj/Debug/main.o

所以我写了一个命令,用完全相同的标志编译Xpressive.hpp文件:

sudo g++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp

我再次使用-H编译了原始代码,并得到以下输出:

1
2
3
4
5
6
7
8
g++ -Wall -fexceptions -H  -g     -c main.cpp -o obj/Debug/main.o
! /usr/local/include/boost/xpressive/xpressive.hpp.gch
main.cpp
. /usr/include/c++/4.4/iostream
.. /usr/include/c++/4.4/x86_64-linux-gnu/bits/c++config.h
.. /usr/include/c++/4.4/ostream
.. /usr/include/c++/4.4/istream
main.cpp

!意味着编译器能够使用预编译的头文件。 x表示它无法使用。使用适当的编译器标志至关重要。我摘下-H并进行了一些速度测试。预编译的头文件从14秒提高到11秒。不错,但不是很好。

注意:以下是示例的链接:http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.examples我无法使其在发布。

顺便说一句:我正在使用以下g ++

g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3


首先,请参阅此处的文档。

您可以像其他任何文件一样编译标头,但是将输出放在后缀为.gch的文件中。

因此,例如,如果您预编译stdafx.h,则将具有一个预编译的标头,只要包含stdafx.h,该标头就会自动搜索名为stdafx.h.gch的标头。

例:

stdafx.h:

1
2
#include <string>
#include <stdio.h>

a.cpp:

1
2
3
4
5
6
#include"stdafx.h"
int main(int argc, char**argv)
{
  std::string s ="Hi";
  return 0;
}

然后编译为:

> g++ -c stdafx.h -o stdafx.h.gch
> g++ a.cpp
> ./a.out

即使在步骤1之后删除了stdafx.h,您的编译也将起作用。


C ++预编译标头的-x说明符是-x c++-header,而不是-x c++。以下是PCH的示例用法。

pch.h

1
// Put your common include files here: Boost, STL as well as your project's headers.

main.cpp

1
2
#include"pch.h"
// Use the PCH here.

像这样生成PCH:

1
$ g++ -x c++-header -o pch.h.gch -c pch.h

pch.h.gch必须与pch.h在同一目录中才能使用,因此请确保从pch.h所在的目录中执行上述命令。


调用gcc的方式与调用源文件的方式相同,但带有头文件。

例如

1
g++ $(CPPFLAGS) test.h

这将生成一个名为test.h.gch的文件

每次gcc搜索test.h时,它都会首先查找test.h.gch,如果找到它,它将自动使用它。

可以在GCC预编译标题下找到更多信息


过去,我已经设法使预编译的头文件在gcc下工作了一次,我还记得当时也有问题。要记住的是,如果不满足某些条件,gcc将忽略该文件(header.h.gch或类似文件),可以在gcc预编译的头文件说明页上找到该文件的列表。

通常,最简单的方法是让构建系统首先编译.gch文件,并使用与其他源代码相同的命令行选项和可执行文件。这样可以确保文件是最新的,并且没有细微的差异。

首先将其与人为设计的示例一起使用可能也是一个好主意,只是消除了您的问题特定于项目中的源代码的可能性。


推荐阅读