Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [C] inb( ) e outb( ) della libreria asm

    Devo compilare questo file http://digilander.libero.it/ing.elettronica/PCCAN.C in un s.o. Linux (red hat 7.2) :

    quando compilo con gcc mi dice undefined reference to inb() e undefined reference to outb(), nonostante il file io.h stia effettivamente nella sottodirectory /asm della directory /include (nel codice c'è #include <asm/io.h> ).

    Ho urgente bisogno di far girare questo programma, qualcuno può darmi una mano?

  2. #2
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <asm/io.h>
    #ifdef __alpha__
    #include <sys/io.h>
    #endif

  3. #3
    scusa, ho sbagliato a linkare il documento.. quello del messaggio iniziale è il sorgente di partenza da compilare in ambiente windows.

    Quello che ho modificato per essere compilato in Linux ha effettivamente tutti gli include che tu mi hai suggerito, ma gcc continua a darmi errori del tipo:

    /tmp/ccVOUVh8.o(.text+0xeb3): undefined reference to 'outb'

    per le outb() e inb().

    Eppure nella sottodirectory /asm della directory /usr/include il file io.h c'è!!

  4. #4
    Prova a compilare con le ottimizzazioni abilitate

    ad esempio

    gcc -c PCCAN.C -O2

    e poi fai link

    gcc -o PCCAN PCCAN.C

  5. #5
    grazie del consiglio ma non c'è niente da fare.. ho provato anche a scrivere per esteso il path del file io.h scrivendo #include </usr/include/asm/io.h> ma la risposta di gcc è sempre la stessa:

    lnx.c: In function `main':
    lnx.c:110: warning: return type of `main' is not `int'
    /tmp/cci9nCVd.o: In function `main':
    /tmp/cci9nCVd.o(.text+0x5d): undefined reference to `kbhit'
    /tmp/cci9nCVd.o: In function `caninit':
    /tmp/cci9nCVd.o(.text+0xb49): undefined reference to `outb'
    /tmp/cci9nCVd.o(.text+0xb76): undefined reference to `outb'
    /tmp/cci9nCVd.o(.text+0xb86): undefined reference to `inb'
    /tmp/cci9nCVd.o(.text+0xbcb): undefined reference to `outb'
    /tmp/cci9nCVd.o(.text+0xbe0): undefined reference to `outb'
    /tmp/cci9nCVd.o(.text+0xbf5): undefined reference to `outb'
    /tmp/cci9nCVd.o(.text+0xc0a): undefined reference to `outb'
    /tmp/cci9nCVd.o(.text+0xc1c): undefined reference to `outb'
    /tmp/cci9nCVd.o(.text+0xc31): more undefined references to `outb' follow
    /tmp/cci9nCVd.o: In function `transmit':
    /tmp/cci9nCVd.o(.text+0xcc1): undefined reference to `inb'
    /tmp/cci9nCVd.o(.text+0xd06): undefined reference to `outb'
    /tmp/cci9nCVd.o(.text+0xd1b): undefined reference to `outb'
    /tmp/cci9nCVd.o(.text+0xd64): undefined reference to `outb'
    /tmp/cci9nCVd.o(.text+0xd7f): undefined reference to `outb'
    /tmp/cci9nCVd.o: In function `receive':
    /tmp/cci9nCVd.o(.text+0xdad): undefined reference to `inb'
    /tmp/cci9nCVd.o(.text+0xdf5): undefined reference to `inb'
    /tmp/cci9nCVd.o(.text+0xe0d): undefined reference to `inb'
    /tmp/cci9nCVd.o(.text+0xe88): undefined reference to `inb'
    /tmp/cci9nCVd.o(.text+0xeb3): undefined reference to `outb'
    collect2: ld returned 1 exit status

    a parte kbhit che devo ancora sostituire con una funzione compatibile con linux, il problema è sempre lo stesso: inb() e outb() proprio non me le vuole vedere!

  6. #6
    nemmeno con le ottimizzazioni abilitate -O1 e -O2 cambia qualcosa.

    Questo tuo stesso suggerimento l'ho trovato in questo howto http://it.tldp.org/HOWTO/IO-Port-Programming.html

    riporto testualmente la parte che mi interessa:

    Le routine per accedere alle porte I/O sono in /usr/include/asm/io.h (o linux/include/asm-i386/io.h nella distribuzione del sorgente del kernel). Tali routine sono delle macro inline, quindi è sufficiente usare #include <asm/io.h>; non vi serve nessuna libreria aggiuntiva.

    A causa di una limitazione in gcc (presente fino alla versione 2.7.2.3) e in egcs (tutte le versioni), dovete compilare qualunque sorgente che usa tali routine con l'ottimizzazione abilitata (gcc -O1 o maggiore), oppure #define extern deve essere vuoto prima di mettere #include <asm/io.h>.

    scusa l'ignoranza, ma cosa significa che "#define extern deve essere vuoto prima di mettere l'include"?

  7. #7
    kbhit non c'è su Unix.
    Te la devi fare a mano con le system call o usare gli ncurses.

    Ciao !

  8. #8
    Lo so, ma io mi riferivo al problema delle inb() e outb() che non riuscivo a far vedere. Comunque ho risolto il problema cambiando distribuzione. Adesso va..

  9. #9
    Siamo alle solite, adesso non mi vede le funzioni della libreria canlib.h che è regolarmente in /usr/include !

    E non ci sono ottimizzazioni che tengano.. non funziona né con -O1 né con -O2 !!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.