Forum: PC-Programmierung Arduino Globale Variable in Header File


von Bert S. (kautschuck)


Lesenswert?

Hi,

Ich habe auf einem ESP32-WROVER ein Projekt am laufen und habe bereits 
FreeRTOS integriert. Nun brauche ich ein paar Queues und muss die 
irgendwo global deklarieren, also habe ich für den Task, der die Queues 
abarbeitet, die Queues im Header deklariert. Nun kommt aber immer die 
Fehlermeldung:

sketch\ESP32_WROOVER.ino.cpp.o:(.bss.debug_queue+0x0): first defined 
here
sketch\WLAN_Manager.cpp.o:(.bss.rs485_queue+0x0): multiple definition of 
`rs485_queue'
sketch\ESP32_WROOVER.ino.cpp.o:(.bss.rs485_queue+0x0): first defined 
here

Dabei habe ich die rs485_queue in allen anderen Header files als extern 
eingefügt (ohne extern nur in einem Header file), ausser beim 
ESP32_WROOVER.ino.cpp, da ich nicht genau weiss, wie sich das eigentlich 
zusammensetzt. Jemand eine Idee, was genau ich da tun kann?

: Bearbeitet durch User
von Chaos Programmierer (Gast)


Lesenswert?

In Header Files definiert man keine Variablen. Nein
das tut man nicht. Punkt.

Variablen definiert man in einem C File in der geeigneten
Hierarchie-Position als nicht-static und bezieht sich in
den anderen Sourcen (nicht Headern) mit "extern" darauf.

von Εrnst B. (ernst)


Lesenswert?

Bert S. schrieb:
> Dabei habe ich die rs485_queue in allen anderen Header files als extern
> eingefügt (ohne extern nur in einem Header file),

Muss genau andersherum sein. Im Header mit "extern", in einem 
Source-File ohne.

von Bert S. (kautschuck)


Lesenswert?

Chaos Programmierer schrieb:
> static

Danke, war genau das was ich brauche. Das macht man normalerweise schon 
nicht so, aber bei geteilten xQueues sehe ich nicht viele andere 
Möglichkeiten.

von Vincent H. (vinci)


Lesenswert?

Chaos Programmierer schrieb:
> In Header Files definiert man keine Variablen. Nein
> das tut man nicht. Punkt.

Doch seit 2017 tut man das.

https://en.cppreference.com/w/cpp/language/inline

: Bearbeitet durch User
von Carl D. (jcw2)


Lesenswert?

Vincent H. schrieb:
> Chaos Programmierer schrieb:
>> In Header Files definiert man keine Variablen. Nein
>> das tut man nicht. Punkt.
>
> Doch seit 2017 tut man das.
>
> https://en.cppreference.com/w/cpp/language/inline

So man die richtige Compiler-Version (z.B. GCC >=7) hat.

Edit: davor könnte Attribute "weak" funktionieren.
1
  RTOS_Queue myQueue __attribute__ ((weak));

: Bearbeitet durch User
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.