4

我正在使用带有 flycheck 的 emacs 来检查 C 源代码语法并试图让它与 glib 一起使用。我的代码编译并正确运行,但是 flycheck 在行中报告了一个文件未找到错误#include <glib.h>并停止报告进一步的错误,从而违背了它的目的。

这是我的示例源文件:

#include <stdio.h>
#include <glib.h>

GList* list = NULL;

int main() {
    list = g_list_append(list, "a");
    list = g_list_append(list, "b");
    list = g_list_append(list, "c");

    for ( ; list!=NULL; list=list->next) {
        printf("%s\n", (char*)list->data);
    }
    return 0;
}

和makefile

P=glist
OBJECTS=
CFLAGS=-g -Wall -O3 `pkg-config --cflags glib-2.0`
LDLIBS=`pkg-config --libs glib-2.0`
CC=gcc-4.9

$(P): $(OBJECTS)

如果我将包含行更改为读取#include <glib-2.0/glib.h>,则会在 minibuffer 中报告以下错误:

检查器 c/c++-clang 返回非零退出代码 1,但输出中没有错误:在 /var/folders/ f/ts3 zs3cjbq1fqfhdfrl1w0000gn/T/flycheck87881gVK/glist.c:2:/usr/local/include 包含的文件中/glib-2.0/glib.h:32:10:错误:找不到包含的“glib/galloca.h”文件;改用“引号”在/var/folders/_f/ts3 _zs3cjbq1fqfhdfrl1w0000gn/T/flycheck87881gVK/glist.c:2 包含的文件中:在/usr/local/include/glib-2.0/glib.h:32 包含的文件中: /usr/local/include/glib-2.0/glib/galloca.h:34:10:致命错误:找不到“glib/gtypes.h”文件

检查器定义可能有缺陷。

代码仍然可以正确编译和运行。我不确定为什么它无法找到glib/gtypes.h,因为它存在于包含的目录之一下。的输出pkg-config --cflags glib-2.0是:

-I/usr/local/Cellar/glib/2.36.4/include/glib-2.0 -I/usr/local/Cellar/glib/2.36.4/lib/glib-2.0/include -I/usr/local/opt /gettext/包括

清单ls /usr/local/Cellar/glib/2.36.4/include/glib-2.0/glib/gtypes.h

/usr/local/Cellar/glib/2.36.4/include/glib-2.0/glib/gtypes.h

并上市ls /usr/local/include/glib-2.0/glib/gtypes.h

/usr/local/include/glib-2.0/glib/gtypes.h

所以文件在那里。如果要归咎于 flycheck,我不介意切换到 flymake,但我不确定这是我的设置问题还是 flycheck 本身的问题。加上 flycheck 配置非常简单,否则效果很好。我正在使用从 elpa 安装的版本 20130904.2245。

4

1 回答 1

6

Flycheck 不使用 Makefile,也不会尝试解析它们。我不禁想知道你是怎么想到这个主意的,因为手册中没有记录这种行为,甚至不存在 make 文件的语法检查器。

Flycheck直接运行 Clang。您需要通过flycheck-clang-include-path相应的设置显式配置语法检查的包含路径。您必须自己这样做,这不会根据您的 Makefile自动完成。

您可以通过文件/目录局部变量设置路径,或者编写一些自定义 Emacs Lisp 代码来解析您的 Makefile。

于 2013-09-09T11:00:41.610 回答