(注意:这不是关于UNRESOLVED符号的问题;这是一个关于不正确的RESOVLED符号的问题,而且,它是一个索引器问题,而不是构建问题。我们的构建是在外部完成的并且工作正常;我们使用Eclipse仅作为编辑,在进行CDT导入项目之后。)
我们正在使用Eclipse neon.3(4.6.3)和CDT开发Linux共享库。该库是EVENTUALLY安装到本地系统,并且是针对它构建的测试应用程序,但这不是每天都会发生的。但是,一旦安装,那些需要保持原样。
问题是索引器在/ usr / local中找到了头文件而不是正在开发的项目中的 。这是令人恼火的,因为进入类定义最终会在系统目录中打开一个过时的版本。假设您没有注意到,那么您进行了一系列更改,转而保存,并对编辑只读文件抱怨很大,此时您会发现问题。
我已经能够禁用所有,并尝试手动添加所有路径,但问题是索引器无法找到C ++标准库头,以及那些可能会有所不同。
什么是最紧凑,最受限制和最正确的方法,以确保索引器在/ usr / local之前总是在项目中找到标题?
约束:
因为库的头文件是在其后来链接的应用程序和它自己的内部代码中使用的,所以这些头文件使用以下形式的include指令:
#include <my-lib/subsystem/ThingyDingy.h>
应自动发现特定于工具链的标题,例如C ++标准库。
可悲的是,我们使用并将需要继续使用Boost。这意味着&#34;所有标题变体&#34;选项等,需要留下来。
自由:
如果有一种理智的方法可以排除/ usr / local / my-lib因为任何原因被编入索引,这是可以接受的(例如,它甚至不需要回退,任何使用它完全出于任何原因完全不受欢迎。)
只要标准库和Boost仍然可以找到并正确编入索引,我就可以抛弃启发式魔术技巧。
对所有建议开放,但请确保您对使用当前CDT的Eclipse neon.3(4.6.3)非常熟悉。我们绝对淹没了古代版本的糟糕建议。另外,我们没有用它来解决这个问题,并且有可能它是最近的回归,尽管我认为最佳方法的问题仍然是两种方式。
我们疯狂地与我们的工具作斗争。发送帮助。请。
答案 0 :(得分:4)
您需要在“项目设置”中更改提供商的顺序 - &gt; C / C ++一般 - &gt;预处理器包含路径 - &gt;提供者。
更改它以便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
项目中的“覆盖”ftp.h具有相同的内容,除了PRELIM现在== 8和TYPE_A被注释掉了。
这样的Makefile:
all:
gcc main.c -o main -Iinclude
如果我在没有-Iinclude
的情况下构建,我会#error Wrong ftp.h!
,而-Iinclude
一切正常。
但是,如果我打开我的编辑器,我会启用两个#ifdef块,因此CDT报告错误。
然后转到项目设置 - &gt; C / C ++一般 - &gt;路径和符号 - &gt;包括选项卡,并将项目的include
目录添加到Include目录。
由于处理顺序,仍然失败。
然后转到项目设置 - &gt; C / C ++一般 - &gt;预处理器包含路径 - &gt;提供程序选项卡并在 CDT托管构建设置条目下移动 CDT GCC内置编译器设置