Eclipse CDT:未正确解析Glib头

Eclipse CDT:未正确解析Glib头,c,eclipse,eclipse-cdt,glib,C,Eclipse,Eclipse Cdt,Glib,我正在开发一个C应用程序,并使用EclipseCDTIDE,我觉得这很好。该项目使用Glib、Gtk和GStreamer,因此每当我在文件中使用它们的某些功能时,我需要包括: #include <glib.h> #include <gtk/gtk.h> #include <gst/gst.h> #包括 #包括 #包括 代码编译时没有任何错误,因为在CMakeLists.txt中正确设置了搜索这些头的PATH变量。 然而,在项目中工作时,我发现在代码中突出显

我正在开发一个C应用程序,并使用EclipseCDTIDE,我觉得这很好。该项目使用Glib、Gtk和GStreamer,因此每当我在文件中使用它们的某些功能时,我需要包括:

#include <glib.h>
#include <gtk/gtk.h>
#include <gst/gst.h>
#包括
#包括
#包括
代码编译时没有任何错误,因为在CMakeLists.txt中正确设置了搜索这些头的PATH变量。 然而,在项目中工作时,我发现在代码中突出显示了一些恼人的错误,例如
gchar
GValue
GTKApplication
;概述的错误为“符号****无法解决”。这些定义位于我的EclipseIDE无法找到的头文件中(包含在glib.h中),如果不是在编译时(实际上程序编译正确)。相反,gst.h中定义的类型
GError
,不会被预编译器突出显示为错误

我希望我的EclipseIDE可以搜索嵌套的头文件(#include in an#inlcude in in…)来找到那些类型定义,这样就不会突出显示那些恼人的错误。我怎样才能做到?我不想直接包含完成类型定义的所有文件

编辑:正如乔纳·格雷厄姆(Jonah Graham)所概述的,问题不在于Eclispe对标题进行“单步研究”,因为它像任何其他IDE一样检查其他包含中的包含。这是一个带有c和Eclipse的CMake bug


提前感谢。

您面临的问题是*。CMake无条件地将
\uuu cplusplus
添加到定义的符号中,这意味着在C模式下glib头无法正确解析。通过打开
gmacros.h
围绕
G\u BEGIN\u DECLS
的定义,您可以清楚地看到这一点:

因为CMake告诉CDT
\uuu cplusplus
已经定义,它认为
G\u BEGIN\u DECLS
也已经定义,这使得像这样的代码从
gtypes.h
解析错误:

G_BEGIN_DECLS

/* Provide type definitions for commonly used types.
 *  These are useful because a "gint8" can be adjusted
 *  to be 1 byte (8 bits) on all platforms. Similarly and
 *  more importantly, "gint32" can be adjusted to be
 *  4 bytes (32 bits) on all platforms.
 */

typedef char   gchar;
...
当然,如果没有定义gchar,其他一切都会很糟糕

幸运的是,在CMake中解决问题之前,有一个快速的解决方法,从CDT中的信息中删除
\uu cplusplus

  • 开放项目属性
  • C/C++包括路径和符号
  • 从列表中删除
    \uuu cplusplus
    ,然后按OK
  • (有时需要)右键单击项目->索引->重建

  • *如果你更了解CMake,可能还有其他解决办法。该漏洞还表示将在下一版本的CMake中修复

    我也许能写一个较长的答案,但我不确定你有什么问题。AFAICT看起来CDT无法找到glib.h所在位置的详细信息,或者可能找不到与内置编译器宏相关的类似内容。手册中有关于设置扫描仪发现的信息,或者您可能想考虑其中的一个,但是我不使用它们,所以YMMV.Eclipse找到GLIB。当然,问题是,由GLUB.H所包含的标头中定义的类型不是Eclipse CDT的CONSITER,因为它进行了“一步研究”。事实上,例如,如果我直接在源文件中包含定义了GValue的头文件,那么突出显示GValue的错误就会消失。但是我希望Eclipse通过扩展glib.h中包含的头文件来自动完成这项工作,并且不必包含所有必要的头文件(太多了)。不,CDT不做“一步研究”。CDT当然会检查include,否则即使是标准头文件也无法工作。如果您在github上弹出项目,我可以看看是否可以重现您的问题。好的,它已经在github上了:。