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:
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 (set USE_PRECOMPILED_HEADER
for VS only):
#ifdef USE_PRECOMPILED_HEADER
... my stuff
#endif
Use the approach from here - compile VC++ with /FI
to implicitly include stdafx.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 mess stdafx.h
is pushing a big code base towards. Therefore the option is appealing to me - on Linux you don't have stdafx.h
, while still being able to turn on pre-compiled headers on VS by /FI
only.
stdafx.h
only as a precompiled header (mimic Visual Studio)Your opinion? Are there other approaches to treat the issue?
You're best off using precompiled headers still for fastest compilation.
You can use precompiled headers in gcc as well. See here.
The compiled precompiled header will have an extension appended as .gch
instead of .pch
.
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.