Eclipse CDT对于C标准库标头的“未解决的包含”错误


96

我为eclipse设置了CDT,并编写了一个简单的hello world C程序:

#include <stdio.h>

int main(void){
    puts("Hello, world.");
    return 0;
}

该程序可以正确构建并运行,但是eclipse始终在包含语句的旁边显示该黄色问号,即"Unresolved inclusion: <stdio.h>"当我将鼠标放在其上时。

它不会影响程序的运行,但我觉得很烦。

有谁知道如何删除它?


2
您会认为Hello World示例将为您完成此操作,或者至少会提供一些帮助。如果eclipse不包含编译器,为什么不包含它?
Doug Molineux 2012年

Answers:


50

Eclipse使用的编译器能够很好地解析符号,因此代码可以正常编译。

但是,Eclipse正在使用的代码完成/索引器或预处理器不知道在哪里stdio.h存在。

您需要指定文件系统所在的路径stdio.h

Eclipse文档在几个针对编译器的部分中对此进行了描述:

并且如果代码完成/索引器或预处理器也无法定位stdio.h

的确切位置stdio.h取决于您打算为其编写代码的系统。如果要为运行Eclipse的同一系统编写代码,则标准位置适用/usr/include/stdio.h于Linux,macOS,Cygwin等。

如果要针对单独/远程目标系统(例如Android,Raspberry Pi,STM32)进行交叉编译,则它将位于为该系统安装的SDK中的某个位置。您将需要参考该特定的SDK文档。


2
谢谢回复。但是Ubuntu 11.10的路径在哪里?
Derrick Zhang

让我感到困惑的一件事是,我不得不将路径添加到“包括”选项卡,而不是“库路径”选项卡。我一直以为“ anglebracket”包含是“ library”包含。
aaaidan

1
您可以在包括选项卡上指定在何处查找头文件(即.h文件)。您可以在库路径选项卡上告诉链接器在哪里可以找到已编译的库文件。引号和尖括号的约定可能取决于编译器,但我始终认为<>表示在标准系统库中首先显示的含义,而“”表示在项目中首先查看的含义。
2012年

2
现代编译器在引号和尖括号之间没有区别。常规上,标准系统接头连接器仍放在尖括号中。
Seppo Enarvi 2012年

53

我发现这些答案(包括已接受的答案)有些含糊。

对我来说,我必须添加stdio.h所在的路径(如@ardnew所说)。在Eclipse中,打开项目的属性,展开“ C / C ++ General”,然后选择“ Paths and Symbols”。

确保已include为使用的每种语言添加了目录。(就我而言,我只需要将其添加到GNU C ++中即可。)

在此处输入图片说明


这离我所需要的非常好!只需更改路径中的用户名。
卢卡斯

2
在OS X上,您可能需要使用命令手动安装命令行开发人员工具(首先需要安装Xcode)/usr/bin/xcode-select --install,然后才能将Eclipse指向/usr/include/
RobV

1
在优胜美地。使用Eclipse Juno。除了我给出的路径略有不同(/ Users / SrinivasanNatarajan / android-ndk / platforms / android-19 / arch-arm / usr / include)外,这种方法对我来说很有用。即使所有未解决的错误消失了,我仍然怀疑“我是否设置了正确的路径”。“ Eclipse真烂”。必须花费数小时才能设置IDE进行开发。
Srinivasan N

1
谢谢。只有你的变体帮助了我。
Nikmoon '16

就我而言(使用MinGW),使用“文件系统...”添加目录“ C:\ MinGW \ include”
Gary99,2018年

17

只是增加了知识库,我刚刚在cygwin的win7上做到了这一点。

这似乎对我有用。

包括c的路径:

D:\dev\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include
D:\dev\cygwin\usr\include

包含C ++的路径:

D:\dev\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include
D:\dev\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\include\c++
D:\dev\cygwin\usr\include

这使我可以轻松地编辑“ hello world”。


我来自未来。我来说谢谢。这实际上是对我有用的第一件事。香港专业教育学院从未有过如此艰难的世界。谢谢你,先生。
nVentimiglia 2014年

17

转到项目>属性> C / C ++常规>预处理程序包含>提供程序,然后选择两个:

  • “ CDT GCC内置编译器设置”
  • “ CDT CROSS GCC内置编译器设置”

对于每个选项,还选择一个子条目:“使用在项目之间共享的全局提供程序”。

在Ubuntu 16.04中使用C和C ++ hello世界在Eclipse 4.8.0上进行了测试。


3
...并选中“使用项目之间共享的全局提供程序”框
Urhixidur

我还必须检查@Urhixidur提到的“使用项目之间共享的全局提供程序”。我针对此内建的Eclipse错误尝试了大量解决方案,而这实际上是对我有用的解决方案。这些线很烦人。谢谢!
CodeGuyRoss

10
  • 选择文件>>新建项目
  • 在项目向导中,选择C / C ++ >> C ++项目
  • 在“项目类型”部分中,选择“ Makefile项目>> Hello world C ++项目
  • 在“工具链”部分中,选择“ Linux GCC

它可以解决问题。(对不起,英语不好)


1
我做了这些事情,但是它仍然不知道标题在/ usr / include中。
卡迪夫太空人

比添加每个包含您自己的内容容易得多。我确实使用了跨平台选项,该选项也很好用(在Ubuntu上)
panmari

很有帮助!很棒的英语。
AturSams

您如何在现有项目上执行此操作?
杰伊·埃尔斯顿

4

我将Cygwin与Eclipse结合使用,这对我有用:

转到项目>属性> C / C ++常规>预处理程序包括...>提供程序,然后选择“ CDT GCC内置编译器设置Cygwin [Shared]”。


4

我正在使用多个交叉编译器配置,在这里我需要为STD头文件(和其他环境变量)使用不同的位置。

解决方案是设置索引器,以便它使用活动配置。
不幸的是,由于eclipse中的一些错误,该选项未存储在本地,因此如果要在再次打开eclipse时保存配置,则必须使用工作区配置。

窗口->首选项-> C / C ++->索引器->使用活动构建配置

这将使eclipse使用项目的活动Cross GCC配置中设置的正确编译器。


有相同的问题,交叉编译到ESP8266。太糟糕了,此页面是如此拥挤,不得不自己弄清楚。
MichaelBöckling'16

这次真是万分感谢。创建多个交叉编译器配置后(对于ESP32“ ESP-IDF”嵌入式SDK的不同版本),我也遇到了这个问题。索引器未拾取正确的标头。此设置似乎允许索引器使用与活动配置相同的环境,就我而言,它允许它选择正确的标题。
davidA

3

作为最重要的答案,有必要指定构建文件夹的位置,可以通过右键单击项目,然后选择“属性”->“ C / C ++常规”->“路径和符号”,通过一个对话框来添加构建文件夹。

剩下的问题是需要添加哪些路径。

如果您已经正确设置了gcc以进行命令行访问,并且需要知道默认使用的include路径是什么,请询问;根据您感兴趣的语言,使用:

gcc -x c -v -E /dev/null
gcc -x c++ -v -E /dev/null

...这将列出调用gcc时使用的默认编译器设置(并且在OSX上,如果“ gcc”确实是clang的别名,则此命令也适用)。

/dev/null 用作空文件-我们告诉gcc解析一个空文件

-x <language> 指定需要编译的语言,因为我们没有使用带有扩展名的文件来指定语言

-v 详细输出,包括输出包含路径

-E 仅执行预处理,输出预处理的文件(这可以防止gcc抱怨一个空文件无法正确编译)

最下面的是包含目录的列表:

#include "..." search starts here:
#include <...> search starts here:
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/7.0.2/include
 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/usr/include
 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/System/Library/Frameworks (framework directory)
End of search list.

如果按照列出的顺序在Eclipse的路径和符号对话框中输入此处列出的目录,则Eclipse CDT应该能够找到标准的标头,也许还有一些特定于您的OS的标头。

(感谢devnull对相关问题的回答。)


确实非常有用。
sancho.s ReinstateMonicaCellio

1

在ADT中,我执行了以下操作:

  1. 右键单击该项目,然后选择“属性”
  2. 展开“ C / C ++常规”,然后选择“预处理器包含路径,宏等”。
  3. 选择CDT用户设置条目
  4. 从右侧菜单中选择添加...
  5. 在添加包含目录中,将项目路径更改为文件系统路径
  6. 浏览到包含您的包含文件的目录
  7. 根据需要搅拌并重复

1

通常,Eclipse应该能够自动解析标​​准包含文件。它通过调用gcc并询问其配置来做到这一点。Eclipse最有可能找不到您的gcc(或至少找不到您用于编译的版本)。

您可能要确保Eclipse找到gcc,而不是在项目设置中指定所有标准的include路径。在启动Eclipse之前,将找到gcc的目录添加到PATH环境变量中。

如果希望不同的项目使用不同的编译器,则可能需要调整发现选项。这些默认情况下是隐藏的,因此首先从“窗口”>“首选项”>“ C / C ++”>“属性页面设置”>“显示“发现选项””页面启用它们。然后,您可以在项目属性的C / C ++ Build> Discovery Options下找到它们。


1

我正在使用基于eclipse的CodeWarrior IDE进行嵌入式项目,我刚刚通过删除项目地址-> C / C ++常规->路径和Sybols->包含目录并再次添加源地址来解决此问题。这意味着有很多理由接受“未解决的包含:”消息,并且也有很多解决方案。


0

配置路径和符号的错误是,最初我配置了其他语言的包含路径。我正在使用CDT和Cygwin gnu C ++。因此,您必须使用GNU C ++语言配置符号和路径。在此处输入图片说明


0

也设置${COMMAND}gccLinux

下:

  • 项目
  • 物产
  • C / C ++常规
  • 预处理器包含路径,宏等
  • 提供者
  • CDT GCC内置编译器设置
  • 获取编译器规格的命令

更换:

${COMMAND} ${FLAGS} -E -P -v -dD "${INPUTS}"

与:

gcc -std=c99 -E -P -v -dD "${INPUTS}"

如果您不这样做,则Eclipse标准输出将显示:

Unable to find full path for "-E"

${HOME}/eclipse-workspace/.metadata/.log显示以下日志:

!ENTRY org.eclipse.cdt.core 4 0 2020-04-23 20:17:07.288
!MESSAGE Error: Cannot run program "-E": Unknown reason

因为${COMMAND} ${FLAGS}为空,所以Eclipse尝试执行-E下一个。

我想知道我们是否可以在设置上正确定义COMMANDFLAGS变量,但是我试图将它们添加为构建变量,但没有用。

问题的C ++版本:如何在Eclipse CDT的C ++文件中解决“未解决的包含:<iostream>”?

已在Eclipse 2020-03(4.15.0),Ubuntu 19.10和带有现有资源的最小Makefile项目中进行了测试


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.