我为eclipse设置了CDT,并编写了一个简单的hello world C程序:
#include <stdio.h>
int main(void){
puts("Hello, world.");
return 0;
}
该程序可以正确构建并运行,但是eclipse始终在包含语句的旁边显示该黄色问号,即"Unresolved inclusion: <stdio.h>"
当我将鼠标放在其上时。
它不会影响程序的运行,但我觉得很烦。
有谁知道如何删除它?
我为eclipse设置了CDT,并编写了一个简单的hello world C程序:
#include <stdio.h>
int main(void){
puts("Hello, world.");
return 0;
}
该程序可以正确构建并运行,但是eclipse始终在包含语句的旁边显示该黄色问号,即"Unresolved inclusion: <stdio.h>"
当我将鼠标放在其上时。
它不会影响程序的运行,但我觉得很烦。
有谁知道如何删除它?
Answers:
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文档。
我发现这些答案(包括已接受的答案)有些含糊。
对我来说,我必须添加stdio.h所在的路径(如@ardnew所说)。在Eclipse中,打开项目的属性,展开“ C / C ++ General”,然后选择“ Paths and Symbols”。
确保已include
为使用的每种语言添加了目录。(就我而言,我只需要将其添加到GNU C ++中即可。)
/usr/bin/xcode-select --install
,然后才能将Eclipse指向/usr/include/
只是增加了知识库,我刚刚在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”。
转到项目>属性> C / C ++常规>预处理程序包含>提供程序,然后选择两个:
对于每个选项,还选择一个子条目:“使用在项目之间共享的全局提供程序”。
在Ubuntu 16.04中使用C和C ++ hello世界在Eclipse 4.8.0上进行了测试。
我正在使用多个交叉编译器配置,在这里我需要为STD头文件(和其他环境变量)使用不同的位置。
解决方案是设置索引器,以便它使用活动配置。
不幸的是,由于eclipse中的一些错误,该选项未存储在本地,因此如果要在再次打开eclipse时保存配置,则必须使用工作区配置。
窗口->首选项-> C / C ++->索引器->使用活动构建配置
这将使eclipse使用项目的活动Cross GCC配置中设置的正确编译器。
作为最重要的答案,有必要指定构建文件夹的位置,可以通过右键单击项目,然后选择“属性”->“ 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的标头。
通常,Eclipse应该能够自动解析标准包含文件。它通过调用gcc并询问其配置来做到这一点。Eclipse最有可能找不到您的gcc(或至少找不到您用于编译的版本)。
您可能要确保Eclipse找到gcc,而不是在项目设置中指定所有标准的include路径。在启动Eclipse之前,将找到gcc的目录添加到PATH环境变量中。
如果希望不同的项目使用不同的编译器,则可能需要调整发现选项。这些默认情况下是隐藏的,因此首先从“窗口”>“首选项”>“ C / C ++”>“属性页面设置”>“显示“发现选项””页面启用它们。然后,您可以在项目属性的C / C ++ Build> Discovery Options下找到它们。
我正在使用基于eclipse的CodeWarrior IDE进行嵌入式项目,我刚刚通过删除项目地址-> C / C ++常规->路径和Sybols->包含目录并再次添加源地址来解决此问题。这意味着有很多理由接受“未解决的包含:”消息,并且也有很多解决方案。
也设置${COMMAND}
为gcc
Linux
下:
更换:
${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
下一个。
我想知道我们是否可以在设置上正确定义COMMAND
和FLAGS
变量,但是我试图将它们添加为构建变量,但没有用。
问题的C ++版本:如何在Eclipse CDT的C ++文件中解决“未解决的包含:<iostream>”?
已在Eclipse 2020-03(4.15.0),Ubuntu 19.10和带有现有资源的最小Makefile项目中进行了测试。
您是否检查它是否从命令行编译?对于我在Linux上的帮助,请apt安装libc-dev。