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

    Problema di compilazione in C

    Ho un problema con la compilazione di alcuni file sotto linux (vorrei un vostro parere).
    Il problema è il seguente.
    Ho installato la nuova libreria canlib.h (difatti risulta presente sotto la cartella /usr/include) e quando all'interno di un file sorgente cerco di richiamare una funzione dichiarata all'interno di questa, emergono in fase di compilazione i seguenti errori (tralasciando i warning):

    prova.c: In function 'main':
    prova.c:43: warning: pointer targets in passing argument 3 of 'canGetBusParams' differ in signedness
    prova.c:43: warning: pointer targets in passing argument 4 of 'canGetBusParams' differ in signedness
    prova.c:43: warning: pointer targets in passing argument 5 of 'canGetBusParams' differ in signedness
    prova.c:43: warning: pointer targets in passing argument 6 of 'canGetBusParams' differ in signedness
    prova.c:43: warning: pointer targets in passing argument 7 of 'canGetBusParams' differ in signedness
    /root/tmp/cc03bVu9.o: In function `check':
    prova.c.text+0x17): undefined reference to `canGetErrorText'
    /root/tmp/cc03bVu9.o: In function `main':
    prova.c.text+0x8d): undefined reference to `canOpenChannel'
    prova.c.text+0xdd): undefined reference to `canSetBusParams'
    prova.c.text+0x148): undefined reference to `canGetBusParams'
    collect2: ld returned 1 exit status
    make: *** [prova] Error 1

    Ciò che non non riesco a capire è come risolvere l'errore 'undefined reference to....', e mi servirebbe un vostro parere.

    grazie per l'aiuto

    p.s: un'altra cosa. Per compilare dalla shell di linux oltre al comando make seguito dal nome del file sorgente da compilare, quali altre operazioni dobbiamo eseguire? Ciao

  2. #2

    Re: Problema di compilazione in C

    Originariamente inviato da romaluca
    [...]Il problema è il seguente.
    Ho installato la nuova libreria canlib.h (difatti risulta presente sotto la cartella /usr/include) e quando all'interno di un file sorgente cerco di richiamare una funzione dichiarata all'interno di questa, emergono in fase di compilazione i seguenti errori (tralasciando i warning):
    [...]
    Ciò che non non riesco a capire è come risolvere l'errore 'undefined reference to....', e mi servirebbe un vostro parere.
    C'e` un equivoco di fondo.
    'canlib.h', come la stragrande maggioranza degli header file in C, _non_ e` una libreria, bensi`, appunto, un header file; tali file contengono dichiarazioni, non definizioni.
    Prototipi di funzioni, non implementazioni delle suddette.

    Le definizioni, le variabili effettive, il codice vero e proprio insomma si trova (quasi sempre) infatti nelle librerie vere e proprie, che altro non sono che codice compilato con gli opportuni parametri.

    Installare una libreria precompilata si traduce infatti in due passaggi: installare il o gli header file della libreria, in modo da rendere disponibile le dichiarazioni al codice che vorra` usare detta libreria, e installare l'implementazione della stessa, quella che convenzionalmente si chiama, appunto, libreria, che tradizionalmente si posiziona in /usr/lib o /lib o /usr/local/lib o in altro luogo

    "undefined reference to" si ottiene quando si manca il secondo passo elencato. Il compilatore ha concluso con successo piu` o meno netto il suo lavoro, avendo prodotto file oggetto grazie (anche) alla presenza degli header file opportuni; la palla passerebbe a questo punto al linker, che dovrebbe collegare i file oggetto in modo opportuno alle librerie indicate (con collegamento statico o dinamico), dando forma infine il prodotto voluto, un eseguibile in questo caso.
    Ma in questo caso mancano le librerie vere e proprie, e cosi` il linker non puo` trovare i "riferimenti" ai simboli presenti nel compilato (e dichiarati grazie agli header file inclusi)". E quindi fallisce.

    Per cui, la soluzione e` installare la libreria vera e propria, e indicare a gcc (che invoca in modo trasparente il linker) come utilizzarla

    p.s: un'altra cosa. Per compilare dalla shell di linux oltre al comando make seguito dal nome del file sorgente da compilare, quali altre operazioni dobbiamo eseguire? Ciao
    beh, dipende da cosa vuoi/volete ottenere; make e` un frontend che puo` compiere molteplici azioni, tra cui, principalmente, guidare la compilazione/produzione di software.
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

  3. #3
    Grazie dell'utile aiuto...
    Ora però il problema è un'altro!!!!!
    Essendo io un novello di linux vorrei sapere: Come si installa il file sorgente canlib.c???
    E soprattutto dove lo devo installare???

    ciao e grazie

  4. #4
    Originariamente inviato da romaluca
    Essendo io un novello di linux vorrei sapere: Come si installa il file sorgente canlib.c???
    E soprattutto dove lo devo installare???
    Non si installa, tipicamente. Aggiungilo semplicemente (se la licenza lo permette, ma presumo di si) alla directory dei sorgenti del software che vuole utilizzare canlib e compilarla insieme ad essi...
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

  5. #5
    cosa intendi più precisamente per: 'aggiungilo alla directory...'

    Scusami ma sono nuovo di linux...

  6. #6
    Originariamente inviato da romaluca
    cosa intendi più precisamente per: 'aggiungilo alla directory...'
    Semplicemente copia canlib.c e canlib.h nella directory dei sorgenti del codice che stai cercando di compilare (al solito, se le rispettive licenze sono compatibili).
    Quindi compila semplicemente il sorgente tutto assieme.

    Esempio:
    codice:
    gcc -Wall -g -O -I. -o programma codice.c canlib.c
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

  7. #7
    Grazie... per l'aiuto... ho risolto il problema!!!

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 © 2024 vBulletin Solutions, Inc. All rights reserved.