14

我在具有多架构构建的项目中使用 GCC 预编译头文件,但是当我尝试将其放置在与当前源目录不同的目录中时,事情就崩溃了。

该文件包含在双引号中,如果我将其更改为尖括号,它可以工作,但问题是我有很多其他项目使用相同的预编译头名称,因此将它们全部更改为尖括号是不可取的因为它可能会在相同文件的 Visual Studio 构建中包含哪个标头产生歧义。

GCC 在其搜索路径之前搜索当前目录中的双引号包含。我可以使用-I-选项(例如-Ipch_dir.i686 -I-)解决它,以便在当前目录之前搜索预编译的头文件目录,但不推荐使用此选项。GCC 建议我使用-iquote,但它的效果与-I-.

所以问题是如何在不将所有预编译的头文件包含指令更改为尖括号并使用不推荐使用的 GCC 开关的情况下使其工作?

4

1 回答 1

11

我找到了一种解决方法。

  1. 以不同的名称构建预编译的标头。例如是头是a.h,原始预编译头是pchdir.i686/a.h.gch,构建它为

    gcc a.h -o pchdir.i686/a-precompiled.h.gch
    
  2. 使用 GCC 的-include开关来确保重命名的标头包含其他任何内容之前(甚至在原始 之前a.h),例如

    gcc -Ipchdir.i686 -include a-precompiled.h <other arguments> <source>
    
  3. 源文件中的最终包含顺序将是:a-precompiled.h.gch, a.h,我已经用-H. 包含原始标头,但实际上并未处理,因为预编译标头具有相同的包含保护(#error在构建预编译的标头后也可以通过在原始标头中插入一个来验证)。

于 2010-07-02T10:22:50.327 回答