我在Arch Linux上。我试过 gcc 和 cc。
我有一个很奇怪的问题。我有一个来自/usr/include 的文件(从 Arch 包安装)在这样的 C 程序中。
// prog.c
#include <foobar/foobar.h>
当我改变它时,什么也没发生。让我解释一下。它包括一些C代码。
// foobar/foobar.h
int baz = 1, qux = 2;
最近,它已更新。
// foobar/foobar.h
int baz = 1, qux = 2, norf = 3;
我的测试程序如下所示。
// prog.c
#include <foobar/foobar.h>
printf ("%d %d %dn", baz, qux, norf);
输出:
error: ‘norf’ undeclared (first use in this function)
我可以在同一目录中复制该文件,将其命名为 foobar2.h,然后包含该文件,它会输出:
1 2 3
所以路径不是不正确的。我可以链接到该文件夹,将其命名为 foobar2,并包含 foobar2/foobar.h,它输出:
1 2 3
所以文件没有不正确。
为了确认它没有注册更改,我可以完全销毁 foobar 文件夹并尝试只打印最初位于标题内的 2 个变量。这输出:
1 2
显然有些东西没有更新。当我尝试使用枚举、函数或文件中现有项的新值更新文件并将它们作为文件中的唯一行包含时,会显示相同的行为。没有任何更改注册。使用 gcc 和 cc 显示相同的活动。这种情况已经持续了几个月,但仍未自行解决。
当文件似乎没有更新时,最好检查系统上编译器搜索库以查找名称相同的文件夹的其他位置。在这种情况下,它是在/usr/local/include 中,我有一个编译并完全忘记的版本。
这可能主要是由于包含目录路径不匹配。查看可能影响行为的环境变量,如 C_INCLUDE_PATH
、 CPATH
。另一种选择是在编译时检查gcc -I/src/directory foobar.h
,这可以使您更接近问题或在代码中使用#include "foobar.h"
。
如果您的系统中有多个程序副本,则可能会使用完全不同的文件进行编译和执行,这也可能导致更改无法反映。