TL;DR:如果之前没问题,突然出现这个错误,那可能是因为改了include搜索的路径(比如定义了CPLUS_INCLUDE_PATH
和C_INCLUDE_PATH
环境变量)。如果确实如此,试试把这些变量取消或者从中删除含有stdlib.h
的文件夹。
(一个脑子正常的程序员不应该首先想到改系统里的标准库头文件内容!)
环境信息
- OS:CentOS 7 Linux
- 编译器:gcc (GCC) 10.2.1 20210130 (Red Hat 10.2.1-11)
错误信息
如下图,编译时cstdlib报错,说里面的#include_next <stdlib.h>
所要的stdlib.h
找不着。
但是这东西其实是存在的(我从来就没动过它):
相关背景知识
首先看到#include_next
这玩意不太常见——我们正常都是#include
,没next
。那这个东西是干啥的呢?简单来说,它会include下一个(也就是按顺序找到的第二个)为此名字的头文件。
官方解释(英文):https://gcc.gnu.org/onlinedocs/cpp/Wrapper-Headers.html
CSDN解读(中文):https://blog.csdn.net/fjb2080/article/details/5247494
我就不继续解读了。对我们来说,问题是这玩意对include搜索的路径非常敏感!如果你定义了CPLUS_INCLUDE_PATH
,里面又确实有个路径包含了stdlib.h
(比如我就是把系统默认include路径/usr/include
也加进去了),这就会影响include_next
的行为,从而导致错误。
至于cstdlib
里面为什么要有这个,据我理解是为了确保使用C语言的stdliib.h
而非libstdc++
的(因为如果直接include,好像是会优先找到和cstdlib
在同一目录下的stdlib.h
)。
而,我确实定义了CPLUS_INCLUDE_PATH
,而且里面也确实带了包含stdlib.h
的目录(系统默认include路径/usr/include
)。所以——
解决办法
就是把我手贱加进去的/usr/include
删掉。= =