Newsgroup: it.comp.lang.c
Titolo: Errore: Undefined reference

Ciao a tutti, stavo provando KDevelop 4 come editor C ma quando vado a
compilare ottengo un errore. Vorrei sapere se sbaglio io o è
configurato male il compilatore visto che con altri 2 compilatori il
codice funziona.
/*------------------------------------------
lib.h------------------------------------------------------*/
typedef struct {
    char elements[MAX_STACK_SIZE];
    int topIndex;
} SStack;
void SStack_Init(SStack* ssVector);
/*------------------------------------------
lib.c------------------------------------------------------*/
void SStack_Init(SStack* ssVector)
{
    int i, j;
    for (i = 0; i < NUM_SPAP; i++)
    {
        for (j = 0; j < MAX_STACK_SIZE; j++)
        {
            ssVector[i]->elements[j] = 0;
        }
        ssVector[i]->topIndex = 0;
    }
}
/*------------------------------------------
main.c------------------------------------------------------*/
SStack vettore[NUM_SPAP];
SStack_Init(vettore);
In pratica dovrebbe creare un vettore di SStack e inizializzarne i
valori a 0
Quando vado a compilare ottengo questo errore:
main.c:10: undefined reference to `SStack_Init'
Grazie in anticipo, Giovanni

 Grazie in anticipo, Giovanni
#include "lib.h" l'hai messo in main.c?
Ciao Jack
Ciao Jack

Grazie per la risposta Jack.
Si la lib.h è inclusa nel main e quelli in maiuscolo sono macro


 Grazie in anticipo, Giovanni
Dovresti includere lib.h anche in lib.c, anche se ti consiglio di
cambiare nome a entrambi i file. Usa qualcosa di meno ambiguo.
Poi devi compilare contemporaneamente main.c e lib.c o main.c e lib.o,
dipende da quello che hai già compilato. Non è sempre facile e scontato
risalire dall'errore diagnosticato dal compilatore all'errore nel sorgente.
-- 
Non puoi insegnare qualcosa ad un uomo. You cannot teach a man anything.
Lo puoi solo aiutare   --  Galileo  Galilei  --   You can only help him
a scoprirla dentro di sé.                        discover it in himself.
Vincenzo Mercuri

Si si, Vincenzo, già fatto. Nel C c'è l'include dell' H. I nomi in
realtà non sono lib, ma abstractMachineV5 .c e.h
l' ho messo per abbreviare un po' ;)
Per la compilazione uso il bottoncino che mi offre Kdevelop. A me
sintatticamente sembra corretto.
Non so... avete altre idee?


Il 01/10/2010 12.25, Giovanni80 ha scritto:
 > Si si, Vincenzo, già fatto. Nel C c'è l'include dell' H. I nomi in
 > realtà non sono lib, ma abstractMachineV5 .c e.h
 > l' ho messo per abbreviare un po' ;)
 > Per la compilazione uso il bottoncino che mi offre Kdevelop. A me
 > sintatticamente sembra corretto.
 > Non so... avete altre idee?
 >
Verifica le maiuscole che linux è case sensitive.
Verifica anche se i file sono raggiungibili con le vari path!
Capita spesso di avere gli h in cartelle differenti

 }
[...]
Non usando KDevelop non saprei cosa consigliarti. Comunque, per poter
usare ssVector[i]->elements[j], ssVector dovrebbe essere un vettore di
puntatori a strutture SStack, ma ssVector è solo un puntatore a SStack.



L'unica che mi viene in mente è che sia un errore del linker e non del
compilatore. Sei sicuro che il file lib.c (o come si chiama) venga
compilato (sia incluso nel progetto)?
Ciao!

Scusate ma credo di aver risposto con un messaggio diretto. Riscrivo
tutto qui.
@Xeus32I nomi rispettano il case e i sorgenti sono allo stesso livello
del main.
@Vincenzo:Ho provato a svuotare il corpo della funzione e il problema
persiste. Sembra che
il modo in cui passo il parametro non vada bene col prototipo.
@FtM: stavo dando un'occhiata nel make ma non vedo riferimenti. non
dovrebbe essere automatico quando è incluso? Puoi dirmi come
controllare esattamente? tnx

 il modo in cui passo il parametro non vada bene col prototipo.
[...]
Riesco a riprodurre lo stesso errore che ti viene segnalato:
     main.c: undefined reference to `SStack_Init'
quando per esempio compilo con gcc main.c, invece di gcc main.c lib.c.
dovresti trovare più sotto anche la scritta:
     ld returned 1 exit status
che indica l'errore nel linking.


si, sembra proprio che sia nel linker... vediamo un po' come
risolvere... mmmm

 controllare esattamente? tnx
se c'è solo l'include no, non è automatico.
Non conosce bene kdeveloper, ma in linea di massima su ogni IDE è tipo
"Aggiungi file a progetto" :-)
Ciao!

Il 01/10/2010 13:02, Vincenzo Mercuri ha scritto:
 > Riesco a riprodurre lo stesso errore che ti viene segnalato:
 >
 > main.c: undefined reference to `SStack_Init'
 >
Umh... a me sembra perň che il problema sia altrove:
mingw32-gcc.exe -Wall  -g     -c G:\dev\test\SStack\lib.c -o obj\Debug\lib.o
G:\dev\testng\SStack\lib.c: In function 'SStack_Init':
G:\dev\testng\SStack\lib.c:11: error: invalid type argument of '->' 
(have 'SStack')
             ssVector[i]->elements[j] = 0;
	...
         ssVector[i]->topIndex = 0;
did you mean...
             ssVector[i].elements[j] = 0;
	...
         ssVector[i].topIndex = 0;
?
Sistemato questo il build va, e lanciandolo non crasha... magari 
KDevelop č cosě stordito che se uno dei file del progetto non compila se 
lo perde per strada, anche se mi sembra molto strano.
-- 
r--r--r--

 ?
[...]
Si anch'io avevo fatto presente questo in un post piů sopra. Ma anche
svuotando il corpo della funzione lui ottiene un messaggio di errore,
che dipende quasi sicuramente da come e se sono stati aggiunti i giusti
files, nei giusti path, al progetto. Io vedrei se per esempio c'č una
funzione per aggiornare il Makefile ad ogni aggiunta al progetto (cosa
che dovrebbe essere automatica ogni volta che si 'rebuilda') e poi
fare Rebuild All.


Raga, è un casino KDevelop 4... dovrei fare le operazioni a mano per
adesso.
Ho messo tutto su Eclipse per C/C++ che automatizza i processi del
make e funziona.
@Vincenzo: ho fatto la correzione che mi avevi detto tu. Probabilmente
non la segnalava come errore perchè neanche la compilava.
Devo un caffè a tutti! grazie mille! :)