使用GCC预编译头文件

任何人都可以获得使用GCC的预编译头文件? 我的尝试中没有运气,我还没有看到如何设置它的很好的例子。 我已经尝试了cygwin gcc 3.4.4并在Ubuntu上使用4.0。

我一定有成功。 首先,我使用了下面的代码:

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

这只是一个来自Boost Xpressive的hello世界(见下面的链接)。 首先,我在gcc中用-H选项编译。 它显示了它使用的标题的巨大列表。 然后,我看看我的IDE(代码::块)正在生产的编译标志,看到这样的事情:

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,并进行了一些速度testing。 预编译头文件从14秒改善到11秒。 不错,但不是很好。

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

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

g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3

首先,请看这里的文档 。

您可以像编译任何其他文件一样编译头文件,但是会将输出内容放在具有.gch后缀的.gch

因此,例如,如果您预编译stdafx.h,您将拥有一个预编译头文件,只要您包含stdafx.h ,就会自动search名为stdafx.h

例:

stdafx.h中:

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

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,编译也将起作用。

我曾经设法在gcc下使用过预编译的头文件,而且我记得还有问题。 需要记住的是,如果不符合某些条件,gcc将忽略文件(header.h.gch或类似文件),其中的列表可以在gcc预编译头文件页面find 。

一般来说,构build系统首先编译.gch文件是最安全的,具有与源代码相同的命令行选项和可执行文件。 这确保文件是最新的,并没有细微的差异。

首先让它与一个人为的例子一起工作可能也是一个好主意,只是为了消除您的问题是特定于您的项目中的源代码的可能性。

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

pch.h:

 <put your common include files here> 

pch.cpp:

 #include "pch.h" 

生成PCH:

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

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

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

例如

 g++ $(CPPFLAGS) test.h 

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

每次gccsearchtest.h时,都会首先查找test.h.gch,如果发现它会自动使用它。

更多信息可以在GCC预编译头文件中find