Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Precompiled headers with GCC

Anyone had any success getting precompiled headers working with GCC? I have had no luck in my attempts and I haven't seen many good examples for how to set it up. I've tried on cygwin gcc 3.4.4 and using 4.0 on Ubuntu.

like image 207
Lee Baldwin Avatar asked Sep 12 '08 12:09

Lee Baldwin


People also ask

Should I use precompiled headers?

Usage of precompiled headers may significantly reduce compilation time, especially when applied to large header files, header files that include many other header files, or header files that are included in many translation units.

Which header file automatically include in source code?

The C compiler automatically adds the C library (usually -lc ) to the linking command.


2 Answers

I have definitely had success. First, I used the following code:

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

This was just a hello world from Boost Xpressive (see below for link). First, I compiled with the -H option in gcc. It showed an enormous list of headers that it used. Then, I took a look at the compile flags my IDE (code::blocks) was producing and saw something like this:

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

So I wrote a command to compile the Xpressive.hpp file with the exact same flags:

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

I compiled the original code again with the -H and got this output:

 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 

The ! means that the compiler was able to use the precompiled header. An x means it was not able to use it. Using the appropriate compiler flags is crucial. I took off the -H and ran some speed tests. The precompiled header had an improvement from 14 seconds to 11 seconds. Not bad but not great.

Note: Here's the link to the example: http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.examples I couldn't get it to work in the post.

BTW: I'm using the following g++

g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3

like image 59
User1 Avatar answered Sep 22 '22 17:09

User1


Firstly, see the documentation here.

You compile headers just like any other file but you put the output inside a file with a suffix of .gch.

So for example if you precompile stdafx.h you will have a precompiled header that will be automatically searched for called stdafx.h.gch anytime you include stdafx.h

Example:

stdafx.h:

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

a.cpp:

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

Then compile as:

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

Your compilation will work even if you remove stdafx.h after step 1.

like image 31
Brian R. Bondy Avatar answered Sep 23 '22 17:09

Brian R. Bondy