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


11

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

# ifdef __i386__
#  include "unistd_32.h"
# else
#  include "unistd_64.h"
# endif

在该文件夹中,我可以找到这些文件(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

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


1
我不明白您问题的后半部分:unistd.hC头文件;它与Java有什么关系?
Riccardo Murri 2010年

@Riccardo我想进行一些在该文件中定义的系统调用。
santiago.basulto 2010年

@ user1531头文件是编译的第一步,因此在运行时不需要它们(您可以在未安装编译器或开发环境的系统上运行代码)。从Java调用C函数是一个完全不同的问题的主题-您似乎已经问过了:-)
Riccardo Murri 2010年

Answers:


12

gcchttp://gcc.gnu.org/onlinedocs/cpp/Search-Path.html上解释了编译器用于查找包含文件的确切规则。

以下是一个快速的命令行技巧,用于找出包含文件的来源:1

echo '#include <unistd.h>' | gcc -E -x c - > unistd.preprocessed

然后,如果您查看unistd.preprocessed文件,您将注意到以下行:

# 1 "/usr/include/unistd.h" <some numbers>

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

因此,如果您想知道其中包含的文件的完整列表,可以对以下# number行进行grep操作:

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

在我的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"

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.