Forum: Mikrocontroller und Digitale Elektronik Grundaufbau eines Projekts mit Arduino: multiple definition of 'xy'


von Peter V. (frischevollmilch)


Lesenswert?

Ich will gerne ein recht großes AVR-Projekt auf einen ESP8266 portieren 
und verwende dazu die Arduino IDE. Ich mag allerdings gar nicht mit so 
vielen .ino-Dateien umzugehen, da ich das Prinzip davon nicht so 
wirklich verstehe. Stattdessen arbeite ich lieber mit den altbekannten 
.c- und .h-Dateien. Dabei bekomme ich nun leider jetzt sehr viele Fehler 
und kann das Programm nicht erfolgreich kompilieren.

Ich habe eine .ino-Datei, über die ich meine header-Dateien einbinde 
über folgenden Code:
1
extern "C"
2
{
3
  #include "user_interface.h"
4
  #include "rgbcube.h"
5
  #include "tlc5947.h"
6
  #include "timer.h"
7
}

In jeder header-Datei verwende ich einen include-Guard der Form

1
#ifndef _TIMER_H
2
#define _TIMER_H
3
4
#include <Arduino.h>
5
[...]
6
7
#endif

In der entsprechenden c-Datei binde ich dann die zugehörige header-Datei 
ganz normal mit #include "timer.h" ein.

Die verschiedenen c-Dateien benutzen allerdings teilweise Funktionen aus 
den jeweils anderen Dateien, wobei es zu Überkreuzungen kommt. Also 1.c 
benutzt eine Funktion von 2.c und 2.c eine Funktion von 1.c. Das sollte 
doch an sich kein Problem sein, oder? Dafür sind ja die header-Dateien 
mit include-Guards gedacht, denke ich.

Wenn ich das Projekt allerdings dann kompiliere, bekomme ich Fehler der 
Art:

1
sketch\timer.cpp.o:(.bss.counter+0x0): multiple definition of `counter'
2
3
sketch\main.ino.cpp.o:(.bss.counter+0x0): first defined here

Davon erhalte ich dann so um die 10 Varianten mit verschiedenen 
Funktionen und Variablen.

Ich habe mich zuvor nie wirklich an die c-Konventionen gehalten 
bezüglich includen von header-Dateien. Zum Beispiel habe ich zuvor immer 
die c-Dateien includet, was man ja nicht machen soll. Aber jetzt will 
ich es gerne mal korrekt machen und nichts klappt. :(

Über eure Hilfe wäre ich wirklich sehr dankbar!

: Verschoben durch User
von Sven B. (scummos)


Lesenswert?

Poste doch mal das ganze Projekt als Archiv oder so. Irgendeine C-Datei 
wird da mehrmals kompiliert, oder so.

von Peter V. (frischevollmilch)


Angehängte Dateien:

Lesenswert?

Okay, der Code ergibt im großen allerdings noch nicht 100% Sinn, da ich 
noch daran bastle. Trotzdem sollte er aber soweit kompilierbar sein. 
Siehe Anhang...

von g457 (Gast)


Lesenswert?

1
$ grep -e counter *
2
tlc5947.h:uint8_t counter;

..und da liegt auch schon das Problem.

HTH

von Peter II (Gast)


Lesenswert?

tlc5947.h

uint8_t counter;

in Header Dateien sollte keine Variablen ohne extern stehen. Sie müssen 
in *.c Dateien stehen.

von g457 (Gast)


Lesenswert?

1
$ grep -e counter -e transmit tlc5947.h 
2
uint8_t counter;
3
extern void transmit_tlc();

..hm, vielleicht solltest Du Dir die Bedeutung von 'extern' nochmals zu 
Gemüte führen.

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.