【问题标题】:Eclipse CDT: Glib headers not parsed correctlyEclipse CDT:Glib 标头未正确解析
【发布时间】:2017-03-09 11:02:36
【问题描述】:

我正在开发一个 C 应用程序,并使用我觉得很棒的 Eclipse CDT IDE。该项目使用 Glib、Gtk 和 GStreamer ,所以每当我在文件中使用它们的一些功能时,我都需要包含:

#include <glib.h>
#include <gtk/gtk.h>
#include <gst/gst.h>

代码编译没有任何错误,因为用于搜索这些标头的 PATH 变量已在 CMakeLists.txt 中正确设置。 但是,在处理该项目时,我发现在我的代码中突出显示令人讨厌的错误,这些错误涉及类型定义,如 gcharGValueGTKApplication;概述的错误是“无法解析符号 ****”。这些定义在我的 Eclipse IDE 找不到的头文件中(包含在 glib.h 中),如果不是在编译时(实际上程序编译正确)。相反,在 gst.h 中定义的类型 GError 不会被预编译器突出显示为错误。

然后我希望我的 Eclipse IDE 可以搜索嵌套标题(#include 在 #inlcude inside...)以找到这些类型定义,以免突出显示那些烦人的错误。我该怎么做?我不想直接包含完成类型定义的所有文件。

编辑:正如 Jonah Graham 所述,问题不在于 Eclispe 对标头进行了“单步研究”,因为它像任何其他 IDE 一样检查其他包含中的包含。这是 c 和 Eclipse 的 CMake 错误

提前致谢。

【问题讨论】:

  • 我也许可以写一个更长的答案,但我不确定您遇到的是哪个问题。 AFAICT 看起来 CDT 无法找到 glib.h 所在位置的详细信息,或者可能与内置编译器宏相关的一些类似内容。手册12 包含有关设置扫描仪发现的信息。
  • 或者你可能想考虑cmake plug-ins之一,但是我不使用它们,所以YMMV。
  • Eclipse 肯定会找到 glib.h,但问题是 Eclipse CDT 不考虑 glib.h 包含的头文件中定义的类型,因为它进行了“一步研究”。实际上,例如,如果我直接在源文件中包含定义 GValue 的标头,则突出显示 GValue 的错误就会消失。但我希望 Eclipse 通过扩展 glib.h 中包含的头文件来自动执行此操作,而不必包含所有必要的头文件(会太多)
  • 不,CDT 不做“一步到位的研究”。 CDT 当然会检查包含的包含,否则即使标准头文件也不起作用。如果你在 github 上弹出你的项目,我可以看看我是否可以重现你的问题。
  • 好的,它已经在 Github 上了:project.

标签: c eclipse eclipse-cdt glib


【解决方案1】:

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

因为 CMake 告诉 CDT __cplusplus 已定义,它认为 G_BEGIN_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 的信息中删除 __cplusplus

  1. 打开项目属性
  2. C/C++ 包含路径和符号
  3. 从列表中删除__cplusplus,然后按确定

  1. (有时需要)右键单击项目 -> 索引 -> 重建

* 如果您更了解 CMake,可能还有其他一些解决方法。该错误还说它将在 CMake 的下一个版本中修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    相关资源
    最近更新 更多