GCC找不到limits.h,尽管我能看到这个头文件

编程语言 2026-07-09

我对用C 进行编程还算新,以前在Windows上用的是Python。现在我想在一台Ubuntu 26.04 LTS的机器上编程,想使用libusb库,但它不起作用…… 我用apt-get升级了gcc,一周前才安装的Ubuntu,然后又重新安装了libusb,试着写出第一条hello-world.c,但没有成功。我花了半天时间才发现涉及头文件的包含那里有问题。

当把limit_not_found.c只写成一行用于测试时:

#include <limits.h>

显示

gcc -c limit_not_found.c
In file included from limit_not_found.c:1:
/usr/include/limits.h:124:26: error: no include path in which to search for limits.h
124 | # include_next <limits.h>
|                          ^
make: *** [Makefile:2: limit_not_found.o] Fehler 1

第3 行好像找到了 /usr/include/limits.h,对吗?因为在第124行对这个文件进行过搜索……但后来同一个文件再也找不到了?

我已经尝试了两天,但不知道该怎么做。最后做的一件事是把这个limits.h复制到了gcc文件夹,因为stdint.h能工作,我也看到那里确实有差异。然后它好用了,但又找不到另一个头文件。嗯,我知道,单独拷贝所有需要的头文件并不是答案。

Makefile:

limit_not_found.o : limit_not_found.c
        gcc -c limit_not_found.c

这里的相关问题没有帮助,谷歌和Ubuntu论坛也都没有人给出答案。有人知道问题可能出在哪里吗?

编辑:在我遇到libusb之前,我想写一个驱动(现在想来有点儿过头了),于是按照 Let's code a Linux Driver - youTube-video 的步骤安装了内核库kernel-libs。我还装了VisualStudioCode。我应该去哪里查找关于故障的细节,以及我是如何走到那里的?

编辑2:

$ gcc --version
gcc (Ubuntu 15.2.0-16ubuntu1) 15.2.0
$ make --version
GNU Make 4.4.1
$ find / -name limits.h 2>/dev/null
/usr/include/limits.h
/usr/include/linux/limits.h
/usr/src/linux-headers-7.0.0-15/include/linux/limits.h
/usr/src/linux-headers-7.0.0-15/include/uapi/linux/limits.h
/usr/src/linux-headers-7.0.0-15/include/vdso/limits.h
/var/lib/flatpak/runtime/org.freedesktop.Platform.GL.default/x86_64/25.08/9d2c591f6563de78605ca5014122481963d3faf3bdbf47f9d07d4710ab55d489/files/lib/x86_64-linux-gnu/clang/21/include/limits.h
/var/lib/flatpak/runtime/org.freedesktop.Platform.GL.default/x86_64/25.08-extra/45661bb5fae01f8a6519ce992de46ddea8d26122ec758a56ea0ef6714ef51a47/files/lib/x86_64-linux-gnu/clang/21/include/limits.h

编辑3:

$ echo '#include <limits.h>' | gcc -H -x c - -fsyntax-only
. /usr/include/limits.h
.. /usr/include/x86_64-linux-gnu/bits/libc-header-start.h
... /usr/include/features.h
.... /usr/include/features-time64.h
..... /usr/include/x86_64-linux-gnu/bits/wordsize.h
..... /usr/include/x86_64-linux-gnu/bits/timesize.h
...... /usr/include/x86_64-linux-gnu/bits/wordsize.h
.... /usr/include/x86_64-linux-gnu/sys/cdefs.h
..... /usr/include/x86_64-linux-gnu/bits/wordsize.h
..... /usr/include/x86_64-linux-gnu/bits/long-double.h
.... /usr/include/x86_64-linux-gnu/gnu/stubs.h
..... /usr/include/x86_64-linux-gnu/gnu/stubs-64.h
In file included from <stdin>:1:
/usr/include/limits.h:124:26: error: no include path in which to search for limits.h
124 | # include_next <limits.h>
^
.. /usr/include/x86_64-linux-gnu/bits/posix1_lim.h
... /usr/include/x86_64-linux-gnu/bits/wordsize.h
... /usr/include/x86_64-linux-gnu/bits/local_lim.h
.... /usr/include/linux/limits.h
.... /usr/include/x86_64-linux-gnu/bits/pthread_stack_min-dynamic.h
..... /usr/include/x86_64-linux-gnu/bits/pthread_stack_min.h
.. /usr/include/x86_64-linux-gnu/bits/posix2_lim.h
Multiple include guards may be useful for:
/usr/include/features-time64.h
/usr/include/limits.h
/usr/include/x86_64-linux-gnu/bits/libc-header-start.h
/usr/include/x86_64-linux-gnu/bits/local_lim.h
/usr/include/x86_64-linux-gnu/bits/long-double.h
/usr/include/x86_64-linux-gnu/bits/pthread_stack_min.h
/usr/include/x86_64-linux-gnu/bits/timesize.h
/usr/include/x86_64-linux-gnu/gnu/stubs-64.h
/usr/include/x86_64-linux-gnu/gnu/stubs.h
$ gcc -E -x c - -v < /dev/null 2>&1 | perl -ne 'print if /^#include <\.\.\.>/ .. /^End of search/'
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/15/include
/usr/local/include
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.

编辑4:

limits.h 在第124行:

# include_next <limits.h>.

解决方案

如果你用 -E标志编译代码(gcc -E main.c),那么你就能看到预处理器之后的C 代码。现在你可以看到头文件是如何包含到源文件中的,像下面这样:

...
# 1 "/usr/include/x86_64-linux-gnu/bits/posix2_lim.h" 1 3 4
# 200 "/usr/include/limits.h" 2 3 4
# 195 "/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h" 2 3 4
# 8 "/usr/lib/gcc/x86_64-linux-gnu/9/include/syslimits.h" 2 3 4
# 35 "/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h" 2 3 4
# 2 "rrr.c" 2
...

现在你应该在这个路径看到limits.h,即 "/usr/lib/gcc/x86_64-linux-gnu/9/include/limits.h"。如果没有,说明有问题,你必须从glibc单独下载limits.h并执行安装(这个问题发生的概率非常低)

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章