有时我看到编译器抱怨这一行
#include <sys/io.h>
带
致命错误:sys / io.h:没有这样的文件或目录
如果我只是将其改为
#include <sys/uio.h>
它会神奇地起作用。有人可以向我解释一下这个区别吗?为什么有些操作系统有一个而不是另一个?
编辑:此问题发生在Linux上,而不仅仅是OS X.
答案 0 :(得分:4)
一般来说,当编译器找不到该头时,简单地更改包含的头文件的名称是不安全的,甚至是不明智的。具有相似名称的标题不一定与彼此有任何关系。
这似乎就是这种情况:GLIBC头文件sys/io.h
没有声明POSIX指定的头sys/uio.h
的向量I / O函数,至少不直接。事实上,GLIBC还提供sys/uio.h
。他们与众不同。 C和POSIX都没有任何理由相信一个系统上的sys/uio.h
会提供由该{或1}}标头提供的任何声明。
如果您正在尝试构建C代码并且找不到某些标头,那么首先要考虑的是包含搜索路径,以及标头名称是否需要添加或删除路径段。接下来要考虑的是构建环境中是否需要该头。如果不是,那么更改标题以命名实际存在的其他标题将修复构建,但是完全删除sys/io.h
指令也是如此。
我对它进行评分更好,实际上,要删除或注释掉这样一个失败的include
指令,确保警告被激活,并查看编译器然后抱怨的遗漏声明是什么(如果有的话)关于。这将为您提供一个句柄,用于确定您应该包含哪个标题(如果有)代替丢失的标题。