路径解析包括

时间:2011-02-13 05:02:38

标签: c gcc

是否有明确的方法可以查看给定#include <example.h>解析的位置?我的代码中有#include <linux/unistd.h>,但我不知道正在使用哪个unistd.h

2 个答案:

答案 0 :(得分:1)

如果使用-E命令行选项获取预处理器输出,它将告诉您包含的每个头文件的完整路径,包括其他头文件包含的那些。例如:

$ cat test.c
#include <unistd.h>
$ gcc -E test.c
# 1 "test.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "test.c"
# 1 "/usr/include/unistd.h" 1 3 4
# 71 "/usr/include/unistd.h" 3 4
# 1 "/usr/include/_types.h" 1 3 4
# 27 "/usr/include/_types.h" 3 4
# 1 "/usr/include/sys/_types.h" 1 3 4
# 32 "/usr/include/sys/_types.h" 3 4
# 1 "/usr/include/sys/cdefs.h" 1 3 4
# 33 "/usr/include/sys/_types.h" 2 3 4
# 1 "/usr/include/machine/_types.h" 1 3 4
# 34 "/usr/include/machine/_types.h" 3 4
# 1 "/usr/include/i386/_types.h" 1 3 4
# 37 "/usr/include/i386/_types.h" 3 4
typedef signed char __int8_t;

(lots more output)

所以在这种情况下,正在使用的标题是/usr/include/unistd.h

答案 1 :(得分:0)

来自GCC documentation

  

在普通的Unix系统上,如果不这样做   如果指示它,它会看起来   对于#include请求的标头    在:

 /usr/local/include
 libdir/gcc/target/version/include
 /usr/target/include
 /usr/include
     

在上面,目标是规范的   已配置系统GCC的名称   编译代码;经常但不是   始终与规范名称相同   它运行的系统。版本是   正在使用的GCC版本。

     

您可以使用以下命令添加到此列表中   -Idir命令行选项。搜索-I命名的所有目录,   从左到右的顺序,在之前   默认目录。唯一的   例外情况是dir已经存在   默认搜索。在这种情况下,   选项被忽略并且搜索顺序   系统目录仍然存在   不变。

因此,除非您添加-I(大眼,非椭圆)切换,否则包含的版本是在第一个保存它的目录中找到的版本。