Come posso sapere quale file unistd.h è stato caricato?


11

Ho diversi unistd.hfile nel mio Ubuntu Linux. Ne ho uno /usr/include/asm/unistd.h. Questo file ha queste direttive:

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

In quella cartella, posso trovare quei file ( unistd_32.he unistd_64.h).

Ma /usr/src/linux-headers-2.6.31-22/include/asm-generic/ce n'è un altro unistd.hche inizia con queste direttive:

#if !defined(_ASM_GENERIC_UNISTD_H) || defined(__SYSCALL)
#define _ASM_GENERIC_UNISTD_H

Quindi, la domanda è: come posso sapere quale è caricato? C'è un modo per controllarlo in runtime con Java?


1
Non capisco la seconda metà della tua domanda: unistd.hè un file di intestazione C; cosa c'entra con Java?
Riccardo Murri,

@Riccardo Vorrei effettuare alcune chiamate di sistema, che sono definite in quel file.
santiago.basulto

@ user1531 I file di intestazione sono inclusi come il primo passo della compilazione, quindi non sono necessari in fase di esecuzione (è possibile eseguire il codice su un sistema su cui non è installato alcun compilatore o ambiente di sviluppo). Chiamare funzioni C da Java è un argomento per una domanda completamente diversa - che sembri aver già fatto :-)
Riccardo Murri

Risposte:


12

Le regole esatte seguite dal gcccompilatore per la ricerca dei file include sono spiegate su: http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

Un rapido trucco da riga di comando per scoprire da dove proviene un file include è il seguente: 1

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

Quindi, se guardi il unistd.preprocessedfile, noterai linee come:

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

Questi indicano che il seguente blocco di linee (fino alla # number ...riga successiva ) proviene dal file /usr/include/unistd.h.

Quindi, se vuoi conoscere l'elenco completo dei file inclusi, puoi grep per le # numberrighe:

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

Sul mio sistema Ubuntu 10.04 / gcc 4.4.3, questo produce:

$ 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 Nota: il percorso di ricerca per i file include è modificato -Idall'opzione della riga di comando; quindi, è necessario aggiungere eventuali -I path argomenti gccall'invocazione. Inoltre, se stai compilando un sorgente C ++, devi sostituirlo -x ccon -x c++.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.