Tenho vários unistd.h
arquivos no meu Ubuntu Linux. Eu tenho um em /usr/include/asm/unistd.h
. Este arquivo tem estas diretivas:
# ifdef __i386__
# include "unistd_32.h"
# else
# include "unistd_64.h"
# endif
Nessa pasta, posso encontrar esses arquivos (unistd_32.h
e unistd_64.h
).
Mas em /usr/src/linux-headers-2.6.31-22/include/asm-generic/
há outro unistd.h
que começa com estas diretivas:
#if !defined(_ASM_GENERIC_UNISTD_H) || defined(__SYSCALL)
#define _ASM_GENERIC_UNISTD_H
Portanto, a questão é: Como posso saber qual está carregado? Existe alguma maneira de verificar isso em tempo de execução com Java?
As regras exatas seguidas pelo compilador gcc
para localizar arquivos de inclusão são explicadas em: http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html
Um truque rápido de linha de comando para descobrir de onde vem um arquivo de inclusão é o seguinte:1
echo '#include <unistd.h>' | gcc -E -x c - > unistd.preprocessed
Então, se você olhar para o unistd.preprocessed
arquivo, você notará linhas como:
# 1 "/usr/include/unistd.h" <some numbers>
Eles informam que o seguinte bloco de linhas (até o próximo # number ...
linha) vêm do arquivo /usr/include/unistd.h
.
Então, se você quiser saber a lista completa de arquivos incluídos, você pode usar o grep para # number
linhas:
echo '#include <unistd.h>' | gcc -E -x c - | egrep '# [0-9]+ ' | awk '{print $3;}' | sort -u*emphasized text*
No meu sistema Ubuntu 10.04/gcc 4.4.3, isso produz:
$ 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 Observação: O caminho de pesquisa para incluir arquivos é modificado pelo -I
opção de linha de comando; então, você deve adicionar qualquer -I path
argumentos para a invocação gcc
. Além disso, se você estiver compilando uma fonte C++, você deve substituir -x c
com -x c++
.