Current GCC (i.e. 4.7) and previous versions of it works nicely with precompiled headers only when you have a single common header to your application, and when that single header (which includes in turn all the system ones, and the library specific ones, required by the application) is #include
-d (as the first non-comment lexeme of your sources) by every source of your application.
So you should have a single yourapp.h
and have every source file (i.e. every compilation unit) of yourapp
starting with #include "yourapp.h"
with the same preprocessing options (i.e. -D
or -I
or -U
) on the command line. That youapp.h
header file is usually #include
-ing many others, e.g. system headers (or GTK or Qt ones) like <stdlib.h>
or <sys/poll.h>
or [in C++] <algorithm>
or <gtk/gtk.h>
or <QtGui>
etc.
Recall that -H
is a useful option to get gcc
tell you what is included.
Your source files might have some additional #include
after #include "yourapp.h"
if so wanted.
After a [single] precompiled header has been included by GCC, you may of course #define
macros, #include
some non-precompiled header, do conditional compilation with #ifdef
, etc. But that preprocessing won't be "pre-compiled"!
This may not fit your needs or habits.
Some people (notably from Google, notably Diego Novillo) are working on the PreParsed Header (pph) branch to improve the situation, but the current GCC trunk has not got that work yet.
The explanation about that behavior of GCC is that a preprocessed header is essentially a persistent serialized checkpoint of the entire GCC heap (related to memory management inside GCC thru Ggc and GTY and gengtype
). That checkpointed heap can be loaded only when gcc
is in its initial empty state. As soon as something is known to gcc
(actually cc1
or cc1plus
) it cannot load any more any precompiled header file *.h.gch
and will revert to parsing the textual header file *.h
.
addenda (november 2014 and later)
Even GCC 4.9 wants a single precompiled header. The pre-parsed header effort by Diego Novillo et al. has been abandoned.
Future versions (post C++14) of the C++ standard might define a module mechanism. See e.g. n4047 proposal and the C++20 standard.
(additional addenda, summer 2020) This still holds for GCC-10 where several static analyzer options exist. See also the Clang static analyzer and this draft report. Consider using Frama-C.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…