How to make GCC search for headers in a directory

2020-05-23 08:21发布

问题:

I am using GCC precompiled headers in my project with multi-architecture build, but things break down when I try to place it in a directory different from current source's directory.

The file is included with double quotes, and it works if I change it to angle brackets, but the problem is that I have a lot of other projects that use the same precompiled header name, so changing all of them to angle brackets is not desirable as it may create ambiguity about which header to include in Visual Studio build of the same files.

GCC searches current directory for double-quote includes before its search path. I can work around it using -I- option (e.g. -Ipch_dir.i686 -I-), so that precompiled headers directory is searched before the current directory, but this option is deprecated. GCC suggests I use -iquote, but it does not have the same effect as -I-.

So the question is how do I make it work without changing all precompiled headers include directives to angle brackets and using a deprecated GCC switch?

回答1:

I have found a workaround.

  1. Build a precompiled header under a different name. For example is the header is a.h, original precompiled header is pchdir.i686/a.h.gch, build it as

    gcc a.h -o pchdir.i686/a-precompiled.h.gch
    
  2. Use GCC's -include switch to make sure the renamed header is included before anything else (even before the original a.h), e.g.

    gcc -Ipchdir.i686 -include a-precompiled.h <other arguments> <source>
    
  3. Final inclusion order in the source file will be: a-precompiled.h.gch, a.h, which I've checked with -H. Original header is included, but is not actually processed because precompiled header has identical include guards (verified as well by inserting an #error in the original header after building the precompiled one).