J'ai plusieurs files unistd.h
dans mon Ubuntu Linux. J'en ai un sur /usr/include/asm/unistd.h
. Ce file a ces directives:
# ifdef __i386__ # include "unistd_32.h" # else # include "unistd_64.h" # endif
Dans ce dossier, je peux find ces files ( unistd_32.h
et unistd_64.h
).
Mais dans /usr/src/linux-headers-2.6.31-22/include/asm-generic/
il y a un autre unistd.h
qui commence par ces directives:
#if !defined(_ASM_GENERIC_UNISTD_H) || defined(__SYSCALL) #define _ASM_GENERIC_UNISTD_H
Donc, la question est: Comment puis-je savoir lequel est chargé? Yat-il un moyen de vérifier dans le runtime avec Java?
Les règles exactes suivies par le compilateur gcc
pour find les files include sont expliquées à: http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html
Une astuce de command line rapide pour savoir d'où provient un file d'inclusion est la suivante: 1
echo '#include <unistd.h>' | gcc -E -xc - > unistd.preprocessed
Ensuite, si vous regardez le file unistd.preprocessed
, vous remarquerez des lignes comme:
# 1 "/usr/include/unistd.h" <some numbers>
Ceux-ci vous indiquent que le bloc de lignes suivant (jusqu'au prochain # number ...
ligne) provient du file /usr/include/unistd.h
.
Donc, si vous voulez connaître la list complète des files inclus, vous pouvez grep pour les lignes # number
:
echo '#include <unistd.h>' | gcc -E -xc - | egrep '# [0-9]+ ' | awk '{print $3;}' | sort -u*emphasized text*
Sur mon système Ubuntu 10.04 / gcc 4.4.3, cela produit:
$ echo '#include <unistd.h>' | gcc -E -xc - | 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 Remarque: Le path de search des files d'inclusion est modifié par l'option de command line -I
; Vous devez donc append les arguments de -I path
à l'invocation gcc
. En outre, si vous comstackz une source C ++, vous devez replace -xc
par -x c++
.