Forum: Compiler & IDEs GCC: Erhalte viele "multiple definition of."


von Der F. (flins)


Angehängte Dateien:

Lesenswert?

Ich erhalte folgende Fehlermeldungen:

Build started 5.5.2010 at 17:40:16
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT 
webcam-starter.o -MF dep/webcam-starter.o.d  -c  ../webcam-starter.c
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT clock.o -MF 
dep/clock.o.d  -c  ../clock.c
avr-gcc -mmcu=atmega8 -Wl,-Map=webcam-starter.map webcam-starter.o 
clock.o     -o webcam-starter.elf
clock.o: In function `Start_Clock':
D:\Elektronik\webcam-starter\webcam-starter\default/../clock.c:215: 
multiple definition of `row'
webcam-starter.o:D:\Elektronik\webcam-starter\webcam-starter\default/../ 
webcam-starter.c:11:  first defined here
clock.o: In function `Start_Clock':
D:\Elektronik\webcam-starter\webcam-starter\default/../clock.c:215: 
multiple definition of `sync'
webcam-starter.o:D:\Elektronik\webcam-starter\webcam-starter\default/../ 
webcam-starter.c:11:  first defined here
clock.o: In function `Start_Clock':
D:\Elektronik\webcam-starter\webcam-starter\default/../clock.c:215: 
multiple definition of `tmp_rise_hh'
webcam-starter.o:D:\Elektronik\webcam-starter\webcam-starter\default/../ 
webcam-starter.c:11:  first defined here
clock.o: In function `Start_Clock':
D:\Elektronik\webcam-starter\webcam-starter\default/../clock.c:215: 
multiple definition of `jumper'
webcam-starter.o:D:\Elektronik\webcam-starter\webcam-starter\default/../ 
webcam-starter.c:11:  first defined here
clock.o:(.data+0xb): multiple definition of `rise_set'
webcam-starter.o:(.data+0xb): first defined here
clock.o:(.data+0xa): multiple definition of `timezone'
webcam-starter.o:(.data+0xa): first defined here
clock.o: In function `Start_Clock':
D:\Elektronik\webcam-starter\webcam-starter\default/../clock.c:215: 
multiple definition of `tmp_rise_mm'
webcam-starter.o:D:\Elektronik\webcam-starter\webcam-starter\default/../ 
webcam-starter.c:11:  first defined here
clock.o: In function `Start_Clock':
D:\Elektronik\webcam-starter\webcam-starter\default/../clock.c:215: 
multiple definition of `rx_bit_counter'
webcam-starter.o:D:\Elektronik\webcam-starter\webcam-starter\default/../ 
webcam-starter.c:11:  first defined here
clock.o:(.data+0x0): multiple definition of `seg7'
webcam-starter.o:(.data+0x0): first defined here
make: *** [webcam-starter.elf] Error 1
Build failed with 1 errors and 0 warnings...


(clock.c:215 zeigt auf die Zeile "DCF77_INT_ENABLE();" aus Ulrich Radigs 
DCF77 Routine; Was hat die Zeile angestellt?)

Was mache ich falsch? Die Forensuche ergab, dass wohl eine Datei 
mehrmals eingebunden wird. Aber wo? Webcam-starter.h wird in beiden 
C-files eingebunden, aber warum sollte das ein Problem sein?
Nehme ich nun die Definitionen aus der *.h und setze sie an den Anfang 
einer *.c, kommen Fehlermeldungen aus der anderen *.c, dass Variablen 
undefiniert sind.

Wäre fein, wenn ihr mir weiterhelfen könntet. Ich kenn mich, ist 
bestimmt nur eine idiotische Kleinigkeit.

: Verschoben durch Moderator
von holger (Gast)


Lesenswert?

Schlag mal das Wort "extern" in deinem C-Buch nach.

von Der F. (flins)


Lesenswert?

Danke erstmal, aber:

mit

extern volatile char jumper;
extern char seg7[10];
extern unsigned char row;
extern unsigned char sync;
extern volatile char tmp_rise_hh;
extern volatile char tmp_rise_mm;
extern signed char timezone;

extern unsigned char rise_set[24][4] = {
                  {7,11,15,22},
                  {7,6,15,39},
                  {6,48,16,6},
                  {6,26,16,30},
                  {5,59,16,53},
                  {5,30,17,16},
                  {4,53,17,34},
                  {4,24,18,4},
                  {3,53,18,29},
                  {3,30,18,50},
                  {3,11,19,11},
                  {3,5,19,22},
                  {3,9,19,25},
                  {3,20,19,17},
                  {3,41,18,57},
                  {4,1,18,34},
                  {4,26,18,0},
                  {4,47,17,30},
                  {5,11,16,55},
                  {5,33,16,25},
                  {6,0,15,33},
                  {6,23,15,32},
                  {6,47,15,16},
                  {7,3,15,13}
                          };


Bleiben die Meldungen:

Build started 5.5.2010 at 18:42:17
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT 
webcam-starter.o -MF dep/webcam-starter.o.d  -c  ../webcam-starter.c
In file included from ../webcam-starter.c:4:
../webcam-starter.h:109: warning: 'rise_set' initialized and declared 
'extern'
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT clock.o -MF 
dep/clock.o.d  -c  ../clock.c
In file included from ../clock.c:4:
../webcam-starter.h:109: warning: 'rise_set' initialized and declared 
'extern'
avr-gcc -mmcu=atmega8 -Wl,-Map=webcam-starter.map webcam-starter.o 
clock.o     -o webcam-starter.elf
clock.o:(.data+0x0): multiple definition of `rise_set'
webcam-starter.o:(.data+0x0): first defined here
clock.o: In function `Start_Clock':
D:\Elektronik\webcam-starter\webcam-starter\default/../clock.c:215: 
multiple definition of `rx_bit_counter'
webcam-starter.o:D:\Elektronik\webcam-starter\webcam-starter\default/../ 
webcam-starter.c:19:  first defined here
make: *** [webcam-starter.elf] Error 1
Build failed with 1 errors and 2 warnings...


Warum meckert er denn jetzt da?

von Hc Z. (mizch)


Lesenswert?

Als extern deklarierte Variablen können nicht gleichzeitig initialisiert 
werden.

Du musst die Variable in genau einem File definieren (also ohne extern 
hinschreiben) und dort initialisieren.  In den anderen Files werden sie 
dann ohne Initialisierung hingeschrieben und als extern deklariert.

In Deinem  Fall musst Du also wohl nur das Schlüsselwort 'extern' 
wegnehmen und in die andere Datei schreiben, am besten bei allen 
Variablen (denn es ist schöner, die Definitionen zusammenzuhalten).

von Karl H. (kbuchegg)


Lesenswert?

Nachdem auch du anscheinend wieder mal zu der Fraktion gehörst, die 
meinen ohne vernünftige Literatur C lernen zu können, lies wenigstens 
die Kurzfassung

http://www.mikrocontroller.net/articles/FAQ#Globale_Variablen_.C3.BCber_mehrere_Dateien

von Der F. (flins)


Lesenswert?

Die Funktion
1
void define_var(void)
2
  {
3
    
4
    ss  = 0;  
5
    mm  = 0;  
6
    hh  = 0;  
7
    day  = 0;  
8
    mon  = 0;  
9
    year  = 0;  
10
    row=0;
11
    sync = 0;
12
    tmp_rise_hh = 0;
13
    tmp_rise_mm = 0;
14
    timezone = 1;
15
    jumper = 0;
16
    seg7[10] = {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0xFE,0x09};
17
18
    rise_set[24][4] = {
19
                  {7,11,15,22},
20
                  {7,6,15,39},
21
                  {6,48,16,6},
22
                  {6,26,16,30},
23
                  {5,59,16,53},
24
                  {5,30,17,16},
25
                  {4,53,17,34},
26
                  {4,24,18,4},
27
                  {3,53,18,29},
28
                  {3,30,18,50},
29
                  {3,11,19,11},
30
                  {3,5,19,22},
31
                  {3,9,19,25},
32
                  {3,20,19,17},
33
                  {3,41,18,57},
34
                  {4,1,18,34},
35
                  {4,26,18,0},
36
                  {4,47,17,30},
37
                  {5,11,16,55},
38
                  {5,33,16,25},
39
                  {6,0,15,33},
40
                  {6,23,15,32},
41
                  {6,47,15,16},
42
                  {7,3,15,13}
43
                          };
44
    }

erzeugt nun

Build started 5.5.2010 at 21:16:06
avr-gcc  -mmcu=atmega8 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT 
webcam-starter.o -MF dep/webcam-starter.o.d  -c  ../webcam-starter.c
../webcam-starter.c: In function 'define_var':
../webcam-starter.c:24: error: expected expression before '{' token
../webcam-starter.c:26: error: expected expression before '{' token
make: *** [webcam-starter.o] Error 1
Build failed with 2 errors and 0 warnings...

Zeile 24: seg7[10] = ...
Zeile 26: rise_set[24][4] = ...


Heut ist nicht mein Tag. Könnt ihr mir nochmal helfen? Ich zweifle 
gerade an meinen C Kenntnissen

von Oliver (Gast)


Lesenswert?

Der Flins schrieb:
> Ich zweifle
> gerade an meinen C Kenntnissen

Woran?

holger schrieb:
> Schlag mal ... in deinem C-Buch nach.

Karl heinz Buchegger schrieb:
> Nachdem auch du anscheinend wieder mal zu der Fraktion gehörst, die
> meinen ohne vernünftige Literatur C lernen zu können,...

Ich kann es jetzt auch nochmal wiederholen:

Die C-Grundlagen lernt man nicht durch trial and error. Die muß man 
einmal richtig lernen.

Und um deine nicht ausgesprochene Frage auch noch zu beantworten: Nein, 
einmal deklarierte Arrays lassen sich so nicht mehr mit Werten füllen.

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Der Flins schrieb:
> Heut ist nicht mein Tag. Könnt ihr mir nochmal helfen? Ich zweifle
> gerade an meinen C Kenntnissen

Man kann Arrays nicht in einem Rutsch zuweisen! Jedes noch so grindige 
C-Buch hätte dir das erklärt.
Wozu brauchst du die Funktion define_var überhaupt?
Alles was du brauchst sind 2 Dinge

Einmal in einem Header File

globals.h
*********
1
extern int  ss;
2
extern int  mm;
3
extern int  hh;
4
5
...
6
7
extern int  seg7[10];
8
extern int  rise_set[24][4];

Das Header File wird überall inkludiert, wo du die globalen Variablen 
brauchst. Anstelle von int kommen natürlich deine richtigen Datentypen 
(war jetzt zu faul die rauszusuchen)

Und in EINEM C-File (egal welchem)

globals.c
*********
1
#include "globals.h"   // ist zwar eigentlich nicht notwendig, aber nur
2
                       // zur Sicherheit. Dann kann der Compiler Datentypen
3
                       // vergleichen
4
5
6
int  ss = 0;
7
int  mm = 0;
8
int  hh = 0;
9
10
...
11
12
int  seg7[10] = {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0xFE,0x09};
13
int  rise_set[24][4] = {
14
                  {7,11,15,22},
15
                  {7,6,15,39},
16
                  {6,48,16,6},
17
                  {6,26,16,30},
18
                  {5,59,16,53},
19
                  {5,30,17,16},
20
                  {4,53,17,34},
21
                  {4,24,18,4},
22
                  {3,53,18,29},
23
                  {3,30,18,50},
24
                  {3,11,19,11},
25
                  {3,5,19,22},
26
                  {3,9,19,25},
27
                  {3,20,19,17},
28
                  {3,41,18,57},
29
                  {4,1,18,34},
30
                  {4,26,18,0},
31
                  {4,47,17,30},
32
                  {5,11,16,55},
33
                  {5,33,16,25},
34
                  {6,0,15,33},
35
                  {6,23,15,32},
36
                  {6,47,15,16},
37
                  {7,3,15,13}
38
                          };

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.