Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-02-2014, 13: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, 14: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, 14: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, 14: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, 14: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 15:03.
sharkkk è offline   Rispondi citando il messaggio o parte di esso
Old 13-02-2014, 15: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, 15: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, 18: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, 19: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, 10: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 11:08.
sharkkk è offline   Rispondi citando il messaggio o parte di esso
Old 14-02-2014, 11: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, 11: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, 11: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, 11: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, 11: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, 11: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, 14: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, 15: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, 15: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, 16: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


Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Samsung copierà Apple? Rincari in...
Google potrebbe rilasciare un'app uffici...
Lies of P, il sequel potrebbe chiamarsi ...
Dreamforce 2026: Salesforce punta sulla ...
SpaceX ha confermato che Flight 14 sar&a...
Googlebook pronto al debutto: Google apr...
Guida all'acquisto: quale lavapavimenti ...
Google Maps su Android Auto introduce fi...
AMD Ryzen 5 5500F: fino al 16% di presta...
L'ecosistema partner di Microsoft cresce...
Oracle registra un boom nella divisione ...
Amazon Prime Video sfida TikTok con le n...
L'uscita di Rayman Legends Retold &egrav...
Dazio UE sui pacchi extra UE, in Italia ...
La nuova lavatrice smart di Xiaomi ha tr...
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:38.


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