Torna indietro   Hardware Upgrade Forum > Software > Programmazione

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
L'IA "seria" di Appian è diversa: inserita nei processi e rispetta dati e persone
L'IA "seria" di Appian è diversa: inserita nei processi e rispetta dati e persone
Ad Appian Europe 2025, l'azienda parla molto della sua visione di cos'è e come dovrebbe essere usata l'intelligenza artificiale: è uno strumento che va sempre adoperato dalle persone, che devono rimanere responsabili dei processi all'interno dell'azienda. Non è un giocattolo con cui sperimentare, ma un aiuto per superare le sfide di business più importanti
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


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...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
DAZN lancia un'offerta flash per il Blac...
Meta Quest 4 è in sviluppo: il nu...
Dall'Olanda arriva l'auto elettrica modu...
La sonda spaziale NASA Voyager 1 tra cir...
La navicella Shenzhou-22 ha effettuato i...
Tre astronauti europei voleranno verso l...
LG UltraGear 37G800A: 37 pollici, 4K e 1...
Stanco dei browser pieni di AI? Orion pe...
GeForce RTX 5000 custom in pericolo? NVI...
Windows Update prende il posto di Micros...
Segnali di crisi per il mercato Smart TV...
Lenovo LEGION e LOQ con NVIDIA GeForce R...
Nuova Fiat 500 ibrida al debutto. Elkann...
Ecco il primo PC da gaming basato su una...
Grok può battere i campioni di Le...
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: 07:07.


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