当前位置:  开发笔记 > 编程语言 > 正文

带有GCC的预编译头文件

如何解决《带有GCC的预编译头文件》经验,为你挑选了5个好方法。

任何人都有成功的预编译头与GCC一起工作?我的尝试没有运气,我没有看到很多关于如何设置它的好例子.我已经尝试过cygwin gcc 3.4.4并在Ubuntu上使用4.0.



1> User1..:

我肯定有成功.首先,我使用了以下代码:

#include 
#include 

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;
}

这只是Boost Xpressive的一个问候世界(见下面的链接).首先,我使用-Hgcc中的选项进行编译.它显示了它使用的大量标题列表.然后,我看看我的IDE(代码:: 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并获得此输出:

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我无法让它在帖子.

BTW:我正在使用以下g ++

g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3


添加-Winvalid-pch将帮助您调试PCH使用中出现问题的原因和原因.
"不错但不是很好":使用gcc 4.4.7,136 .cpp文件总大小为35.5 Mb,148 .h文件总大小为5.5 Mb,.gch文件为48 Mb,Debug构建需要2'20"(vs 2 '14"非pch),-O2优化构建需要4'30"(vs 5'33"non-pch)预计在调试版本附近会有效果,但它只是优化后的构建,它可以从预编译中获益....不知道为什么.在Windows上预编译更具戏剧性!

2> Brian R. Bon..:

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

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

因此,例如,如果您预编译stdafx.h,您将拥有一个预编译的头文件,当stdafx.h.gch您包含时,将自动搜索该头文件stdafx.h

例:

stdafx.h中:

#include 
#include 

a.cpp:

#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,您的编译也会起作用.



3> psaghelyi..:

用于生成pch而不是-x使用-x c++-header.

pch.h:

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

pch.cpp:

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

生成PCH:

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

pch.h.gch必须与pch.h位于同一目录中!


这应该是`-c pch.h`,而不是`-c pch.cpp`?

4> 小智..:

我曾经设法让预编译的头文件在gcc下运行一次,我记得也有问题.要记住的是,如果不满足某些条件,gcc将忽略该文件(header.h.gch或类似文件),其列表可以在gcc预编译头文档页面上找到.

通常,最安全的做法是让构建系统将.gch文件编译为第一步,使用相同的命令行选项并将其作为源的其余部分执行.这可确保文件是最新的,并且没有细微差别.

首先让它使用一个人为的例子也是一个好主意,只是为了消除你的问题特定于项目中的源代码的可能性.



5> 小智..:

调用gcc的方式与为源文件调用gcc相同,但使用头文件.

例如

g++ $(CPPFLAGS) test.h

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

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

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

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有