www.mikrocontroller.net

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


Autor: Der Flins (flins)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schlag mal das Wort "extern" in deinem C-Buch nach.

Autor: Der Flins (flins)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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#Global...

Autor: Der Flins (flins)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Funktion
void define_var(void)
  {
    
    ss  = 0;  
    mm  = 0;  
    hh  = 0;  
    day  = 0;  
    mon  = 0;  
    year  = 0;  
    row=0;
    sync = 0;
    tmp_rise_hh = 0;
    tmp_rise_mm = 0;
    timezone = 1;
    jumper = 0;
    seg7[10] = {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0xFE,0x09};

    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}
                          };
    }

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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
*********
extern int  ss;
extern int  mm;
extern int  hh;

...

extern int  seg7[10];
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
*********
#include "globals.h"   // ist zwar eigentlich nicht notwendig, aber nur
                       // zur Sicherheit. Dann kann der Compiler Datentypen
                       // vergleichen


int  ss = 0;
int  mm = 0;
int  hh = 0;

...

int  seg7[10] = {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0xFE,0x09};
int  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}
                          };

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.