问题描述
我刚刚发现<stdlib.h>
和<stdio.h>
标头位于Ubuntu服务器中的/usr/include
文件夹中,但找不到sys/types.h
。
我开始怀疑编译器实际上不会使用/usr/include
文件夹中的头文件。
这是真的,文件在哪里?
最佳解决办法
我的Debian盒子(并且希望Ubuntu并没有对其热情满怀过分)在/usr/include/sys/types.h
中有它。
最好的选择是首先执行:
find /usr/include -name types.h
然后:
find / -name types.h
如果您没有在第一个中找到它。
但是,请记住,甚至可能没有安装开发资料。我会想象将服务器盒用作服务器,并且如果编译器和其他很多东西不是默认安装的一部分,这也不会令我感到惊讶(但是它将有很多服务器,例如ftpd
或Apache
等)。
如果编译器将其定位在某个地方,而您只是不知道在哪里,则可以使用如下代码:
echo "#include <sys/types.h>" | gcc -E -x c - | grep /types.h
找出它的来源。
要么:
echo "#include <stdio.h>" | gcc -E -x c - | grep /stdio.h
对于您担心的其他标题。
Aside: That
gcc
command line stops after the pre-processing phase (-E
), forces the file to be treated as C source code (-x c
) and retrieves the program from standard input (-
), in this case from theecho
statement.
最后的grep
只是去除了不重要的行。
次佳解决办法
文件sys/types.h
位于/usr/include/sys/types.h
如果您遇到这种致命错误:
.../linux/linux_types.h:146:38: fatal error: /usr/include/sys/types.h: No
such file or directory
通过使用以下代码进行修复:
sudo apt-get install build-essential flex libelf-dev libc6-dev-amd64 binutils-dev libdwarf-dev
第三种解决办法
如果您有可用的定位命令,则只需使用locate
即可:
-bash-3.2$ locate sys/types.h
/usr/include/sys/types.h
/usr/lib/syslinux/com32/include/sys/types.h
-bash-3.2$
这是最快,最简单的方法。
第四种办法
仅供参考,我在debian机器上遇到了这个问题,事实证明,
$ apt-file find /usr/include/sys/types.h
libc6-dev-i386: /usr/include/sys/types.h
libc6-dev-i386是我似乎需要安装的软件包
第五种办法
在Linux上,types.h
应该在/usr/include/sys/types.h
中。