I have a Visual Studio C++ based program that uses pre-compiled headers (stdafx.h
). Now we are porting the application to Linux using gcc 4.x.
The question is how to handle pre-compiled header in both environments. I've googled but can not come to a conclusion.
Obviously I want leave stdafx.h
in Visual Studio since the code base is pretty big and pre-compiled headers boost compilation time.
But the question is what to do in Linux. This is what I found:
- Leave the
stdafx.h
as is. gcc compiles code considerable faster than VC++ (or it is just my Linux machine is stronger ... :) ), so I maybe happy with this option. Use approach from here - make
stdafx.h
look like (setUSE_PRECOMPILED_HEADER
for VS only):#ifdef USE_PRECOMPILED_HEADER ... my stuff #endif
Use the approach from here - compile VC++ with
/FI
to implicitly includestdafx.h
in each cpp file. Therefore in VS your code can be switched easily to be compiled without pre-compiled headers and no code will have to be changed.
I personally dislike dependencies and the messstdafx.h
is pushing a big code base towards. Therefore the option is appealing to me - on Linux you don't havestdafx.h
, while still being able to turn on pre-compiled headers on VS by/FI
only.- On Linux compile
stdafx.h
only as a precompiled header (mimic Visual Studio)
Your opinion? Are there other approaches to treat the issue?
I used option 3 last time I needed to do this same thing. My project was pretty small but this worked wonderfully.
I'd either go for option 4 or option 2. I've experimented with precompiled headers on both various VS versions and GCC on Linux (blog posts about this here and here). In my experience, VS is a lot more sensitive to the length of the include paths, number of directories in the include path and the number of include files than G++ is. When I measured build times properly arranged precompiled headers would make a massive difference to the compile time under VS whereas G++ was pretty much unimpressed by this.
Actually, based on the above what I did the last time I worked on a project where this was necessary to rein in the compile time was to precompile the equivalent of stdafx.h under Windows where it made sense and simply used it as a regular file under Linux.
Very simple solution. Add a dummy file entry for "stdafx.h" in Linux environment.
Since
stdafx.h
is by default all the Windows-specific stuff, I've put an emptystdafx.h
on my other platform. That way your source code stays identical, while effectively disablingstdafx
on Linux without having to remove all the#include "stdafx.h"
lines from your code.