在 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 的最紧凑、受限和正确的方法是什么?
限制条件:
因为库的 header 文件在它的 later-linked 应用程序和它自己的内部代码中使用,所以这些 header 文件使用这种形式的 include 指令:
#include <my-lib/subsystem/ThingyDingy.h>
Toolchain-specific header如C++标准库应该是auto-discovered.
可悲的是,我们使用并且需要继续使用 Boost。这意味着 "all header variants" 选项等需要保留。
自由度:
如果有一种理智的方法可以排除 /usr/local/my-lib 出于任何原因被编入索引,那是可以接受的(例如,它甚至不需要后备,出于任何原因完全不希望使用它。
可以放弃启发式魔术,只要标准库和 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 托管构建设置条目
如图:
这是设置更改前后的对比:
(注意:这不是关于 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 的最紧凑、受限和正确的方法是什么?
限制条件:
因为库的 header 文件在它的 later-linked 应用程序和它自己的内部代码中使用,所以这些 header 文件使用这种形式的 include 指令:
#include <my-lib/subsystem/ThingyDingy.h>
Toolchain-specific header如C++标准库应该是auto-discovered.
可悲的是,我们使用并且需要继续使用 Boost。这意味着 "all header variants" 选项等需要保留。
自由度:
如果有一种理智的方法可以排除 /usr/local/my-lib 出于任何原因被编入索引,那是可以接受的(例如,它甚至不需要后备,出于任何原因完全不希望使用它。
可以放弃启发式魔术,只要标准库和 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 托管构建设置条目
如图:
这是设置更改前后的对比: