|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
[C] gcc - multiple definition of...
Buongiorno!
Durante la compilazione di un programmino in C, il compilatore gcc mi dà in output questo errorino: Codice:
gcc -o main_mate main_mate.c lib.a lib.a(lib_mate.o):(.data+0x0): multiple definition of `LIB_SIMBOLI' /tmp/ccwhL9qR.o:(.data+0x0): first defined here collect2: ld returned 1 exit status - main_mate.c = programmino dove viene lanciato il programma; - lib_mate.h = libreria che contiene strutture e dichirazione funzioni; - lib_mate.c = sorgente dove viene scritto il corpo delle funzioni della libreria: Per la compilazione faccio questi passaggi: 1) gcc -c -o lib_mate.o lib_mate.c 2) ar r lib.a lib_mate.o 3) gcc -c -o main_mate main_mate.c 4) gcc -o main_mate main_mate.c lib.a L'errore significa che ci sono più definizioni di `LIB_SIMBOLI` ma quest'ultimo è stato definito solamente nel sorgente "lib_mate.h". Cosa potrebbe essere allora??? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 558
|
se non hai usato #ifndef e #define forse rischi di includere più volte lo stesso .h e quindi in effetti il compilatore vede la roba definita 2 volte! non so eh...senza vedere i sorgenti non so essere più preciso
|
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
Quote:
Codice:
#ifndef __lib_mate_h_ #define __lib_mate_h_ Codice:
#ifndef lib_mate_h #define lib_mate_h |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Dec 2005
Messaggi: 558
|
scusami ma non capisco il terzo passaggio..in teoria tu compili la tua libreria e va bene, poi dovresti semplicemente compilare il programma principale, quello che ha il main() per intenderci, e poi fai una cosa tipo:
gcc -o main_mate main_mate.c -llib -L. con -l gli dici dove cercare la libreria (che in questo caso è lib.a, bisogna passare dopo il -l semplicemente il nome del .a senza l'estensione) con -L invece gli dici dove cercare l'header (in questo caso . perchè è nella dir corrente) se invece vuoi evitarti il fatto di fare una libreria basta fare gcc -o main_mate main_mate.c lib_mate.c |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
L'errore è provocato dalle seguente riga di codice
Codice:
char *(LIB_SIMBOLI[]) = {"+","-","*","/","sin","cos","tan","asin","acos","atan","log","^","%"}; Come si fa? |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Nei file di header NON si devono fare definizioni di variabili o funzioni.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
Quote:
![]() Per il gcc.... -l è per le librerie statiche o non fà differenza tra statiche e dinamiche? |
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quella LIB_SIMBOLI non è una costante ... è una variabile (e tra l'altro le parentesi tonde non servono).
Il problema è semplice: se in un file di header si fanno definizioni che allocano memoria come appunto definire una variabile o una funzione, allora tali definizioni fanno poi parte del modulo oggetto compilato. Che succede se al linker arrivano più moduli oggetto che contengono simboli con lo stesso nome? ![]()
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
Quote:
![]() Se io volessi dichiarare quel vettore e renderlo visibile a più sorgenti, potrei fare così? Prima lo dichiaro in un sorgente e successivamente negli altri sorgenti .c, farlo riconoscere mediante la parole chiave "extern".. |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Appunto ... si fa la definizione in un sorgente .c e poi negli altri sorgenti (o meglio magari in un header incluso dai sorgenti) si fa una allusione alla variabile/funzione tramite extern (per i prototipi di funzione extern è superfluo).
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
in alcuni casi (non nel tuo) un errore del genere può essere causato da qualche inesattezza nel Makefile
io ad esempio una volta ho perso 10 minuti prima di capire che mettevo lo stesso .o due volte nel Makefile, con una sfilza impressionante di errori "multiple definition of..." ![]() |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Mar 2003
Messaggi: 3852
|
Mi accodo al thread per chiedere: anche nel caso di una variabile intera condivisa tra piu' files, non è buona norma dichiararla nel file.h incluso da tutti ? Mi servirebbe sia visibile da tutti i files che compongono il programma, senza passarla come parametro da un metodo all'altro...
__________________
Cerco fotocamera con buono zoom!! CLICCA! ° Moderatore del Forum Ufficiale di ElaborarE (responsabile sezione HI-FI e Car Audio) ° |
![]() |
![]() |
![]() |
#15 |
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
edit scusate
![]() |
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Jul 2006
Messaggi: 1568
|
Quote:
Codice:
#define VARIABILE_INTERA 1000 Se la variabile che ti serve è costante allora farei così, altrimenti no. Il mio problema era che dovevo dichiarare un vettore di stringhe...per questo ho dovuto dichiararlo nel file .c Ultima modifica di nico88desmo : 30-09-2007 alle 10:40. |
|
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Jul 2002
Città: Milano
Messaggi: 19148
|
la dichiari in uno e poi la metti come extern negli altri
non è bello ma in alcuni casi è necessario |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
In alternativa si può usare (nei .h)
Codice:
__attribute__((section(".gnu.linkonce"))) int var; E' meglio implementarla in un file sorgente e dichiararla come extern negli header.
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 23:51.