Torna indietro   Hardware Upgrade Forum > Software > Programmazione

OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
Abbiamo partecipato all'OVHcloud Summit 2025, conferenza annuale in cui l'azienda francese presenta le sue ultime novità. Abbiamo parlato di cloud pubblico e privato, d'intelligenza artificiale, di computer quantistici e di sovranità. Che forse, però, dovremmo chiamare solo "sicurezza"
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a
Abbiamo potuto mettere le mani in anteprima sul nuovo monitor MSI dedicato ai giocatori: un mostro che adotta un pannello QD-OLED da 26,5 pollici con risoluzione 2560 x 1440 pixel, frequenza di aggiornamento fino a 500 Hz e tempo di risposta di 0,03 ms GtG
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro
DJI aggiorna la sua linea di droni ultraleggeri con Neo 2, un quadricottero da 160 grammi che mantiene la compattezza del predecessore ma introduce una stabilizzazione meccanica a due assi, sensori omnidirezionali e un sistema LiDAR
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-02-2014, 14:49   #1
sharkkk
Member
 
L'Avatar di sharkkk
 
Iscritto dal: Oct 2013
Messaggi: 158
[C] undefined reference

salve a tutti,

allora, ho un progetto con due file .h e un file .c (con il main):

- prototipi delle funzioni nel file primo.h
- implementazioni delle funzioni del file primo.h nel file secondo.h

- inclusione dei due file .h nel file .c dove c'e il main ecc

quando compilo non ci sono errori, ma quando interviene il linker (giusto?) mi da [LINKER ERROR]undefined reference a tutte le funzioni che io ho dichiarato e implementato.

dove sto sbagliando
sharkkk è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2014, 15:30   #2
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
I prototipi delle funzioni vanno bene nel file .h, ma l'implementazione va nei file .c. Comincia a correggere, se hai ancora problemi scrivi i messaggi di errore esatti.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2014, 15:39   #3
sharkkk
Member
 
L'Avatar di sharkkk
 
Iscritto dal: Oct 2013
Messaggi: 158
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
I prototipi delle funzioni vanno bene nel file .h, ma l'implementazione va nei file .c. Comincia a correggere, se hai ancora problemi scrivi i messaggi di errore esatti.
a questo punto pero devo creare un makefile è giusto?

oppure posso includere il file con le implementazioni delle funzioni (secondo.c) direttamente nel main.c con #include "secondo.c"

perchè non mi è mai capitato di usare due file .c nello stesso progetto
sharkkk è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2014, 15:43   #4
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Si, puoi mettere tutto nel main, comunque non è necessario creare il makefile, il compilatore dovrebbe poter compilare più file in un colpo solo, consulta l'help del tuo compilatore per vedere qual'è la sintassi.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2014, 15:54   #5
sharkkk
Member
 
L'Avatar di sharkkk
 
Iscritto dal: Oct 2013
Messaggi: 158
daniels ho provato ad includere il file con #include "secondo.c" (si trova nella stessa cartella del main.c) ma da ancora gli stessi errori di undefined reference.

il compilatore è gcc però per un particolare progetto di sistemi operativi.

a questo punto l'unica alternativa è studiarmi come si crea un makefile giusto? (beh alla fine avrei dovuto impararlo )

p.s.
considerando che il main.c si appoggia su funzioni che stanno nel file secondo.c i cui prototipi stanno in primo.h, qual'è diciamo l'albero delle dipendenze (sto guardando un po di guide e questa cosa ancora mi è sfuggita)
chi ha più priorità nella compilazione?

Ultima modifica di sharkkk : 13-02-2014 alle 16:03.
sharkkk è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2014, 16:10   #6
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
I file .c non vanno inclusi, ma compilati, e i risultati della compilazione (.o) vanno linkati insieme nell'eseguibile.
Non è che non si possano includere i file .c, ma tra regole e convenzioni si rischia di fare un casino, cerchiamo di parlare tutti la stessa lingua
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2014, 16:16   #7
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Ho visto ora che hai aggiornato la risposta...
non è una questione di priorità, i file .c possono essere compilati in modo del tutto indipendente tra loro. Se una funzione F definita nel file A viene richiamata nel file B, è sufficiente che B includa l'header dove c'è il prototipo di F. L'header non deve contenere né variabili né istruzioni, ma solo direttive e definizioni, così può essere incluso in più file .c senza che in fase di link si ci ritrovi con codice o dati duplicati.
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2014, 19:48   #8
sharkkk
Member
 
L'Avatar di sharkkk
 
Iscritto dal: Oct 2013
Messaggi: 158
non ci sto capendo piu nulla, questa parte mi sembra difficile anche se immagino che in realtà sia facilissimo.

ho capito che:
compilo A.c facendolo diventare A.o
compilo B.c facendolo diventare B.o

ho guardato delle guide sui makefile ma ciò che trovo sono tutti argomenti sulle dipendenze, ma come faccio a linkare A.o a B.o?

p.s. esiste l'estensione .e?
sharkkk è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2014, 20:35   #9
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
Non includere i file.c ...

Scrivi

gcc -o eseguibile main.c file1.c file2.c
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2014, 11:44   #10
sharkkk
Member
 
L'Avatar di sharkkk
 
Iscritto dal: Oct 2013
Messaggi: 158
Quote:
Originariamente inviato da lorenzo001 Guarda i messaggi
Non includere i file.c ...

Scrivi

gcc -o eseguibile main.c file1.c file2.c

per compilare di solito usavo scrivere

gcc -c -o eseguibile file.c (non so pero cosa significhi il comando -c)

il tuo comando mi continua a dare errori di undefined reference.

provo a spiegare meglio il progetto come è costruito:

main.c - inclusioni di const.h, funzioni.h
const.h - costanti (nessuna inclusione)
funzioni.h - definizioni delle strutture e dei prototipi delle funzioni (nessuna inclusione)
funzioni.c - implementazione delle funzioni con le strutture e le costanti (nessuna inclusione)

il problema è che sto provando in mille modi ma non capisco come compilare il tutto senza darmi errori di [LINKER ERROR] undefined reference funzione pippo, [LINKER ERROR] undefined reference funzione pluto,..... .

come devo procedere passo per passo per far si che compili ?

Ultima modifica di sharkkk : 14-02-2014 alle 12:08.
sharkkk è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2014, 12:15   #11
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Esempio molto idiota

File --> fact.c
Codice:
int fattoriale(int value){
    if(value <= 0)return 1;
    if(value == 2)return 2;
    int tmp = value--;
    while(value > 1)tmp *= value--;
    return tmp;
}
File --> main.c
Codice:
#include "head.h"

int main(int argn, char ** argp){
    int value = 8;
    printf("Il fattoriale di %d è %d\n", value, fattoriale(value));
    return 0;
}
File --> head.h
Codice:
#include <stdio.h>
#include <stdlib.h>

int fattoriale(int);

Compilazione:
1) gcc -o eseguibile main.c fact.c

oppure

2) gcc -c main.c fact.c / oppure gcc -c *.c
gcc -o eseguibile main.o fact.o / oppure gcc -o eseguibile *.o

Quando esegui gcc -c crei soltanto i files oggetto (estensione .o) e non esegui il linker. Se ometti -c crei file oggetto e richiami anche il linker.

Dai uno sguardo qui --> http://gcc.gnu.org/onlinedocs/gcc/Overall-Options.html

Trucco numero 1 per capirci qualcosa: fai prove stupide e semplici come quella che ti ho fatto vedere io qui sopra.
Quando tu mi scrivi

"per compilare di solito usavo scrivere

gcc -c -o eseguibile file.c (non so pero cosa significhi il comando -c)"

vuol dire che stai digitando comandi a memoria e senza capire... fai prove stupide e semplici e piano piano farai bene progetti più grandi...
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2014, 12:30   #12
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Nel file funzioni funzioni.c devi includere funzioni.h. Per spiegarti il perchè ti faccio un semplice esempio:
Codice:
void A() {
  B();
}

void B() {
...
}
In questo caso viene generato un errore di compilazione perché il compilatore vede una chiamata a B, ma questa non è stata ancora definita.

Comunque non è quello il problema, perché l'errore non viene generato nella fase di compilazione, ma in quella di link, e ciò significa che la funzione "undefined" non si trova in nessuno dei file che stai linkando insieme.

Ti ricordo inoltre che il c è case sensitive, "pluto" è diverso da "Pluto".
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2014, 12:35   #13
sharkkk
Member
 
L'Avatar di sharkkk
 
Iscritto dal: Oct 2013
Messaggi: 158
Quote:
Originariamente inviato da clockover Guarda i messaggi

Compilazione:
1) gcc -o eseguibile main.c fact.c

oppure

2) gcc -c main.c fact.c / oppure gcc -c *.c
gcc -o eseguibile main.o fact.o / oppure gcc -o eseguibile *.o
grazie mille per la risposta clock.

penso di aver capito la tua spiegazione, ma quando lancio il comando

gcc -c main.c funzioni.c

il programma mi da errore, perche non mi riconosce le strutture (in funzioni.h) e le costanti (const.h) nel file funzioni.c

sharkkk è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2014, 12:41   #14
sharkkk
Member
 
L'Avatar di sharkkk
 
Iscritto dal: Oct 2013
Messaggi: 158
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Nel file funzioni funzioni.c devi includere funzioni.h. Per spiegarti il perchè ti faccio un semplice esempio:
Codice:
void A() {
  B();
}

void B() {
...
}
In questo caso viene generato un errore di compilazione perché il compilatore vede una chiamata a B, ma questa non è stata ancora definita.

Comunque non è quello il problema, perché l'errore non viene generato nella fase di compilazione, ma in quella di link, e ciò significa che la funzione "undefined" non si trova in nessuno dei file che stai linkando insieme.

Ti ricordo inoltre che il c è case sensitive, "pluto" è diverso da "Pluto".
ho incluso funzioni.h e anche const.h e ora funziona bene, mi ha creato 2 file oggetto.

ora come devo fare per linkarli?
sharkkk è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2014, 12:41   #15
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
EDIT:
Possiamo avere l'onore di vedere il tuo programma top-secreet?
Come ha detto clockover:
gcc -o eseguibile.exe main.o funzioni.o
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2014, 12:43   #16
sharkkk
Member
 
L'Avatar di sharkkk
 
Iscritto dal: Oct 2013
Messaggi: 158
Quote:
Originariamente inviato da Daniels118 Guarda i messaggi
Possiamo avere l'onore di vedere il tuo programma top-secreet?
sarebbe lunghissimo, perche in realtà io l'ho semplificato moltissimo, posso contattarti in privato per mostrartelo?
sharkkk è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2014, 15:03   #17
sharkkk
Member
 
L'Avatar di sharkkk
 
Iscritto dal: Oct 2013
Messaggi: 158
risolto!

bisogna usare il comando LD
sharkkk è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2014, 16:20   #18
clockover
Senior Member
 
L'Avatar di clockover
 
Iscritto dal: Oct 2004
Messaggi: 1945
Quote:
Originariamente inviato da sharkkk Guarda i messaggi
risolto!

bisogna usare il comando LD
In realtà gcc utilizza proprio ld

Inviato da una supercazzola ed un Nexus 5 scappellato a sinistra.. con senso unico
clockover è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2014, 16:49   #19
Daniels118
Senior Member
 
L'Avatar di Daniels118
 
Iscritto dal: Jan 2014
Messaggi: 852
Misteri del G-C-C...
Daniels118 è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2014, 17:35   #20
lorenzo001
Senior Member
 
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
Quote:
Originariamente inviato da sharkkk Guarda i messaggi
risolto!

bisogna usare il comando LD
Ti avevo detto di usare

gcc -o eseguibile file1.c file2.c

che eseguiva anche il linker ma non l'hai fatto.

Hai voluto generare solo i file oggetto con

gcc -c ...

per poi scoprire, entusiasta, che non eseguiva il linker che potevi eseguire a parte ...

Ma seguire il primo consiglio che ti avevo dato, no ?
lorenzo001 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum OVHcloud Summit 2025: le novità del cloud...
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI C...
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro DJI Neo 2 in prova: il drone da 160 grammi guada...
L'IA "seria" di Appian è diversa: inserita nei processi e rispetta dati e persone L'IA "seria" di Appian è divers...
Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Giorgia Meloni 'una di noi': Palazzo Chi...
Airbus richiama oltre 6.000 A320: rischi...
Tra open hybrid cloud e sovranità...
Il nuovo SSD Samsung è fatto con ...
Russia contro WhatsApp: il piano per spe...
Battlefield 6, oltre 2,39 milioni di ten...
La Cina spiazza tutti: nuovo chip per l'...
Nexperia, altro che caso chiuso: il caos...
Nuova tecnologia AMD FSR Ray Regeneratio...
Motorola Edge 60 Neo e Motorola Moto Wat...
Weekend e offerte Amazon Black Friday ag...
Il tuo indirizzo IP è compromesso...
Eureka J15 Evo Ultra in super sconto: or...
Robot aspirapolvere in super sconto per ...
Black Friday Amazon: le migliori occasio...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 02:10.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v