Eclipse CDT:Glib headers 未正确解析
Eclipse CDT: Glib headers not parsed correctly
我正在开发一个 C 应用程序,并使用 Eclipse CDT IDE,我觉得这很棒。该项目使用 Glib、Gtk 和 GStreamer ,所以每当我在文件中使用它们的一些功能时,我需要包括:
#include <glib.h>
#include <gtk/gtk.h>
#include <gst/gst.h>
代码编译没有任何错误,因为用于搜索那些 header 的 PATH 变量已在 CMakeLists.txt 中正确设置。
但是,在处理该项目时,我发现我的代码中突出显示了令人讨厌的错误,这些错误与 gchar
或 GValue
或 GTKApplication
等类型定义有关;概述的错误是 "symbol **** could not be resolved"。这些定义位于我的 Eclipse IDE 找不到的 header 文件中(包含在 glib.h 中),如果不是在编译时(实际上程序编译正确)。相反,gst.h 中定义的类型 GError
不会被 pre-compiler.
突出显示为错误
然后我希望我的 Eclipse IDE 可以在嵌套的 header 上搜索(#include inside an #inlcude inside...)以找到那些类型定义,以免突出显示那些烦人的错误。我该怎么做?我不想直接包含完成类型定义的所有文件。
编辑:正如 Jonah Graham 所概述的那样,问题不是因为 Eclispe 在 header 上执行了 "single-step research",因为它会像任何其他 IDE 一样检查其他包含中的包含。这是一个带有 c 和 Eclipse
的 CMake 错误
提前致谢。
您面临的问题是 CMake bug*。 CMake 无条件地将 __cplusplus
添加到定义的符号中,这意味着 glib headers 在 C 模式下无法正确解析。您可以通过围绕 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
。
- 打开项目属性
- C/C++ 包含路径和符号
- 从列表中删除
__cplusplus
,然后按确定
- (有时需要)Right-click 在项目上 -> Index -> Rebuild
* 如果您更了解 CMake,可能还有一些其他解决方法。该错误还表示它将在下一个 CMake 版本中修复。
我正在开发一个 C 应用程序,并使用 Eclipse CDT IDE,我觉得这很棒。该项目使用 Glib、Gtk 和 GStreamer ,所以每当我在文件中使用它们的一些功能时,我需要包括:
#include <glib.h>
#include <gtk/gtk.h>
#include <gst/gst.h>
代码编译没有任何错误,因为用于搜索那些 header 的 PATH 变量已在 CMakeLists.txt 中正确设置。
但是,在处理该项目时,我发现我的代码中突出显示了令人讨厌的错误,这些错误与 gchar
或 GValue
或 GTKApplication
等类型定义有关;概述的错误是 "symbol **** could not be resolved"。这些定义位于我的 Eclipse IDE 找不到的 header 文件中(包含在 glib.h 中),如果不是在编译时(实际上程序编译正确)。相反,gst.h 中定义的类型 GError
不会被 pre-compiler.
然后我希望我的 Eclipse IDE 可以在嵌套的 header 上搜索(#include inside an #inlcude inside...)以找到那些类型定义,以免突出显示那些烦人的错误。我该怎么做?我不想直接包含完成类型定义的所有文件。
编辑:正如 Jonah Graham 所概述的那样,问题不是因为 Eclispe 在 header 上执行了 "single-step research",因为它会像任何其他 IDE 一样检查其他包含中的包含。这是一个带有 c 和 Eclipse
的 CMake 错误提前致谢。
您面临的问题是 CMake bug*。 CMake 无条件地将 __cplusplus
添加到定义的符号中,这意味着 glib headers 在 C 模式下无法正确解析。您可以通过围绕 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
。
- 打开项目属性
- C/C++ 包含路径和符号
- 从列表中删除
__cplusplus
,然后按确定
- (有时需要)Right-click 在项目上 -> Index -> Rebuild
* 如果您更了解 CMake,可能还有一些其他解决方法。该错误还表示它将在下一个 CMake 版本中修复。