我怎么知道加载了哪个 unistd.h 文件?

san*_*lto 11 linux c java

unistd.h我的 Ubuntu Linux 中有几个文件。我有一个/usr/include/asm/unistd.h。该文件具有以下指令:

# ifdef __i386__
#  include "unistd_32.h"
# else
#  include "unistd_64.h"
# endif
Run Code Online (Sandbox Code Playgroud)

在那个文件夹中,我可以找到那些文件(unistd_32.hunistd_64.h)。

但是/usr/src/linux-headers-2.6.31-22/include/asm-generic/还有另一个unistd.h以这个指令开头:

#if !defined(_ASM_GENERIC_UNISTD_H) || defined(__SYSCALL)
#define _ASM_GENERIC_UNISTD_H
Run Code Online (Sandbox Code Playgroud)

所以,问题是:我怎么知道哪个加载了?有什么方法可以在运行时使用 Java 进行检查吗?

Ric*_*rri 12

gcc编译器查找包含文件所遵循的确切规则在以下位置进行了说明:http : //gcc.gnu.org/onlinedocs/cpp/Search-Path.html

找出包含文件来自何处的快速命令行技巧如下:1

echo '#include <unistd.h>' | gcc -E -x c - > unistd.preprocessed
Run Code Online (Sandbox Code Playgroud)

然后,如果您查看该unistd.preprocessed文件,您会注意到如下几行:

# 1 "/usr/include/unistd.h" <some numbers>
Run Code Online (Sandbox Code Playgroud)

这些告诉您以下行块(直到下一# number ...行)来自 file /usr/include/unistd.h

因此,如果您想知道包含的文件的完整列表,可以使用 grep 查找以下# number行:

echo '#include <unistd.h>' | gcc -E -x c - | egrep '# [0-9]+ ' | awk '{print $3;}' | sort -u*emphasized text*
Run Code Online (Sandbox Code Playgroud)

在我的 Ubuntu 10.04 / gcc 4.4.3 系统上,这会产生:

$ echo '#include <unistd.h>' | gcc -E -x c - | egrep '# [0-9]+ ' | awk '{print $3;}' | sort -u
"<built-in>"
"<command-line>"
"<stdin>"
"/usr/include/bits/confname.h"
"/usr/include/bits/posix_opt.h"
"/usr/include/bits/predefs.h"
"/usr/include/bits/types.h"
"/usr/include/bits/typesizes.h"
"/usr/include/bits/wordsize.h"
"/usr/include/features.h"
"/usr/include/getopt.h"
"/usr/include/gnu/stubs-64.h"
"/usr/include/gnu/stubs.h"
"/usr/include/sys/cdefs.h"
"/usr/include/unistd.h"
"/usr/lib/gcc/x86_64-linux-gnu/4.4.3/include/stddef.h"
Run Code Online (Sandbox Code Playgroud)

1 注意:通过-I命令行选项修改包含文件的搜索路径;因此,您应该-I pathgcc调用添加任何参数。此外,如果您正在编译 C++ 源代码,则应替换-x c-x c++.