【问题标题】:flycheck header file not found, but makefile is correct找不到flycheck头文件,但makefile是正确的
【发布时间】:2013-09-12 12:50:32
【问题描述】:

我正在使用带有 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 &lt;glib-2.0/glib.h&gt;,我会在 minibuffer 中报告以下错误:

Checker c/c++-clang 返回非零退出代码 1,但没有错误 输出:在包含的文件中 /var/folders/f/ts3zs3cjbq1fqfhdfrl1w0000gn/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/本地/选择/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。

【问题讨论】:

    标签: c emacs makefile clang flycheck


    【解决方案1】:

    Flycheck 不使用 Makefile,也不会尝试解析它们。鉴于手册中没有记录此类行为,并且甚至不存在 make 文件的语法检查器,我不禁想知道您是如何得到这个想法的。

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

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

    【讨论】:

    • 谢谢,这就是我需要的线索。我创建了一个 .dir-locals.el 并将 flycheck-clang-include-path 的值设置为 pkg-config 报告的 glib 目录,它可以工作。
    • @lunaryorn: flycheck with clang checker 不能识别被检查文件同一目录下的包含文件是否正常?
    • @rano 我不知道。没有具体的例子,我不能说。如果您认为 Flycheck 行为错误,请打开一个问题。
    • @lunaryon:在同一个目录中,我有 myfile.h 和 myfile.cpp,最后一个有 include "myfile.h"。使用 clang 作为检查器的 Flycheck 给出错误提示“找不到文件 myfile.h”。使用本地 var flycheck-clang-include-path 指定目录不会出错。我稍后会打开一个问题,即使很难,我还不确定这是否是“可接受的”行为
    • @rano 正如我所说,请打开一个问题。我认为这个讨论不适合 Stack Overflow。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2013-10-15
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    相关资源
    最近更新 更多