Handling stdafx.h in cross-platform code
c++, cross-platform, gcc, stdafx.h, visual-studio
Solution
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.
Problem
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 (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. - On Linux compile `stdafx.h` only as a precompiled header (mimic Visual Studio) Your opinion? Are there other approaches to treat the issue?