在 Eclipse 4.6.3+CDT 中,如何确保索引器将项目 headers 排在系统项目之前?

In Eclipse 4.6.3+CDT, how do I ensure the indexer ranks project headers before system ones?

(注意:这不是关于 UNRESOLVED symbols 的问题;这是关于 INCORRECTLY RESOVLED symbols 的问题,此外,这是一个索引器问题,而不是构建问题。我们的构建是在外部完成的并且工作正常;我们在执行 CDT 导入项目后,仅将 Eclipse 用作编辑器。)

我们正在使用 Eclipse neon.3 (4.6.3) 和 CDT 开发 Linux 共享库。该库最终安装到本地系统,并针对它构建了一个测试应用程序,但这并不是每天都会发生。但是,一旦安装,它们就需要保留在原处。

问题是索引器正在 /usr/local 中找到 header,而不是正在开发的项目 中的 。这很令人恼火,因为转到 class 定义最终会在系统目录中打开一个过时的版本。假设您没有注意到,然后进行了一系列更改,去保存,并收到关于编辑 read-only 文件的大投诉,这时您注意到了问题。

我已经能够禁用一切,并尝试手动添加所有路径,但问题是索引器无法找到 C++ 标准库headers,并且这些位置可能会有所不同。

确保索引器在进入 /usr/local 之前始终在项目中找到 headers 的最紧凑、受限和正确的方法是什么?

限制条件:

  1. 因为库的 header 文件在它的 later-linked 应用程序和它自己的内部代码中使用,所以这些 header 文件使用这种形式的 include 指令:

    #include <my-lib/subsystem/ThingyDingy.h>
    
  2. Toolchain-specific header如C++标准库应该是auto-discovered.

  3. 可悲的是,我们使用并且需要继续使用 Boost。这意味着 "all header variants" 选项等需要保留。

自由度:

  1. 如果有一种理智的方法可以排除 /usr/local/my-lib 出于任何原因被编入索引,那是可以接受的(例如,它甚至不需要后备,出于任何原因完全不希望使用它。

  2. 可以放弃启发式魔术,只要标准库和 Boost 仍然可以找到并正确索引。

接受所有建议,但请确保您非常熟悉 Eclipse neon.3 (4.6.3) 和当前 CDT。我们完全淹没在古代版本的错误建议中。此外,我们过去几乎没有遇到过这么多麻烦,这可能是最近的回归,尽管我认为最好的方法仍然存在。

我们正在疯狂地使用我们的工具。发送帮助。请。

您需要在项目设置 -> C/C++ 常规 -> 预处理器包含路径 -> 提供程序中更改提供程序的顺序。

更改它,使 CDT GCC 内置编译器设置低于项目本地设置,因此优先级较低。

这是我的 MCVE。在我的机器上,我有 /usr/include/arpa/ftp.h 其中包括以下定义:

#define PRELIM      1   /* positive preliminary */
#define TYPE_A      1   /* ASCII */

如果我用这些内容创建 main.c

#include <arpa/ftp.h>

#ifdef TYPE_A
#error Wrong ftp.h!
#endif

#if PRELIM != 8
#error Wrong ftp.h!
#endif

int main() {}

和我在 include/arpa/ftp.h 项目中的 "overridden" ftp.h 具有相同的内容,除了 PRELIM 现在 == 8 并且 TYPE_A 被注释掉了。

还有一个像这样的 Makefile:

all:
    gcc main.c -o main -Iinclude

如果我在没有 -Iinclude 的情况下进行构建,我会得到 #error Wrong ftp.h!,而使用 -Iinclude 一切正常。

但是,如果我打开我的编辑器,我会启用两个 #ifdef 块,因此 CDT 报告错误。

然后转到项目设置 -> C/C++ 常规 -> 路径和符号 -> 包含选项卡并将我项目的 include 目录添加到包含目录。

仍然失败,因为处理顺序。

然后转到项目设置 -> C/C++ 常规 -> 预处理器包含路径 -> 提供程序选项卡并移动 CDT GCC 内置编译器设置 下面 CDT 托管构建设置条目

如图:

这是设置更改前后的对比: