2009-12-23 16 views
7

Sto usando gentoo e sto provando a compilare un programma per controllare i bit sulla porta parallela. Ha questa linea vicino alla parte superiore di esso:"#include <asm/io.h>" cause "errore: asm/io.h: nessun file o directory"

#include <asm/io.h> 

E quando cerco di usare gcc su di esso, produce questo output:

port.c:4:20: error: asm/io.h: No such file or directory

"individuare ASM/io.h" yeilds (tra altre cose):

/usr/src/linux-2.6.32-gentoo/arch/x86/include/asm/io.h

Quindi ho il file di intestazione, ma non lo trova? Perché non funziona?

+1

Non è incluso nel percorso di inclusione predefinito? – Earlz

risposta

10

Non sono sicuro se sei l'autore del programma o si sta solo cercando di compilare un programma che hai da qualcuno, ma looks like#include <asm/io.h> dovrebbe essere sostituito con #include <sys/io.h>. Vedere i risultati di this google search per ulteriori informazioni.

+0

Questo ha funzionato in modo impeccabile, grazie! – marcusw

+0

Felice di essere di aiuto. –

0

Potrebbe essere necessario aggiungere il percorso. Sulla riga di comando gcc:

gcc -I/usr/src/linux-2.6.32-gentoo/arch/x86/include ... 
0

provare

gcc -I/usr/src/linux-2.6.32-gentoo/arch/x86/include xyx 

dove xyz è il file che si sta cercando di compilare.

Questo dice al compilatore dove cercare i file include. Si possono avere molte opzioni -I se il file include sono in luoghi diversi, come questo

gcc -I/usr/src/linux-2.6.32-gentoo/arch/x86/include -I/usr/src/some/Dir xyx 
+0

Grazie, questo problema è stato risolto. L'unico problema ora è che quel file contiene un sacco di altri file, uno dei quali (asm-generic/ioctls.h) semplicemente non esiste sul mio disco dard ... la parte triste è che/usr/include/asm-generic/ioctl.h è presente. Errore di battitura nell'intestazione, forse? – marcusw

+0

Vedi la mia risposta. Sembra che il codice molto vecchio, e cercando di farlo funzionare su un moderno kernel Linux potrebbe essere un sacco di problemi. Posso sapere quale libreria/codice è? –

+0

È parcon, da http://bigasterisk.com/projects/parallel. Mentre c'è un file binario sul sito, non voglio usarlo perché voglio essere in grado di personalizzare il programma in base alle mie esigenze.Ad ogni modo, ho aggiunto un collegamento simbolico da ioctls.h a ioctl.h in/usr/include/asm-generic, più un comando -I/usr/src/linux/include sulla riga di comando, e ora sto ricevendo un sacco di errori in io.h per quanto riguarda gli errori di sintassi e le variabili non definite. Forse il link simbolico non era nel file giusto? – marcusw

0

aggiungere -I/usr/src/linux-2.6.32-gentoo/arch/x86/include al tuo compilazione riga di comando.

4

Mai utilizzare il codice/le intestazioni in /usr/include/asm. Utilizzare invece le intestazioni in /usr/include/sys.

Quello che stai facendo usando /usr/include/asm/ sta creando il tuo codice con una revisione specifica delle intestazioni del kernel. Questo è soggetto a rottura quando cambiano le intestazioni del kernel. Collegando l'altra posizione, si collegherà a una forma più stabile delle intestazioni in glibc, che farà riferimento alle intestazioni del kernel secondo necessità. Ecco perché c'è un grande complesso di linee #ifdef ... #endif disseminato nelle intestazioni.

Fidati di me, tutti gli strumenti necessari per il bit-giocherellare con le porte parallele saranno in /usr/include/sys/io.h, dal momento che probabilmente tutto si sta andando ad essere utilizzando sono diretti readb() e writeb() chiamate al dispositivo appropriato /dev/lpX.

Problemi correlati