Forum: Mikrocontroller und Digitale Elektronik ESP8266 Arduino externe Datei


von Harald H. (mirona)


Lesenswert?

Hallo,
ich möchte die Initialisierungen in meinem Projekt in externe Dateien 
auslagern. Mit einfachen Funktionen funktioniert das auch. Allerdings 
habe ich ein Problem mit der Initialisierung des WiFi.
So wie es unten dargestellt ist, erhalte ich folgende Fehlermeldung:

/Users/###/Library/Arduino15/packages/esp8266/tools/xtensa-lx106-elf-gcc 
/3.0.4-gcc10.3-1757bed/bin/../lib/gcc/xtensa-lx106-elf/10.3.0/../../../. 
./xtensa-lx106-elf/bin/ld: 
/var/folders/hc/vhmyq3qx3f712vrd66vbv_xh0000gn/T/arduino_build_314809/sk 
etch/Test_WiFi_V1.ino.cpp.o:/Users/###/Documents/Arduino/Test_WiFi_V1/Te 
st_WiFi_V1.ino:3:  multiple definition of `MyServer'; 
/var/folders/hc/vhmyq3qx3f712vrd66vbv_xh0000gn/T/arduino_build_314809/sk 
etch/Test1.cpp.o:/Users/###/Documents/Arduino/Test_WiFi_V1/Test1.cpp:3: 
first defined here

collect2: error: ld returned 1 exit status

Bibliothek ESP8266WiFi in Version 1.0 im Ordner: 
/Users/###/Library/Arduino15/packages/esp8266/hardware/esp8266/3.0.2/lib 
raries/ESP8266WiFi   wird verwendet

exit status 1

Fehler beim Kompilieren für das Board NodeMCU 1.0 (ESP-12E Module).

Meine Frage dazu. Wie kann ich die Instanz von WiFiServer MyServer(80) 
als extern einbinden.

Noch allgemeiner gefragt. Kann ich die Instanzen aus den Arduino/ESP8286 
Bibliotheken überhaupt als extern deklarieren?

Lasse ich die extern-Deklaration in der Datei "Test1.cpp" weg, erhalte 
ich als Fehlermeldung:

Test1.cpp:6:3: error: 'MyServer' was not declared in this scope; did you 
mean 'Server'?
    6 |   MyServer.begin();
      |   ^~~~~~~~
      |   Server
Bibliothek ESP8266WiFi in Version 1.0 im Ordner: 
/Users/harald/Library/Arduino15/packages/esp8266/hardware/esp8266/3.0.2/ 
libraries/ESP8266WiFi   wird verwendet
exit status 1
'MyServer' was not declared in this scope; did you mean 'Server'?

Was auch verständlich ist.

Datei "Test_WiFi_V1.ino"
1
#include "Test1.h"
2
3
WiFiServer MyServer(80);
4
5
void setup() {
6
  Set_WiFi ();
7
}
8
9
void loop() {
10
11
}

Datei "Test1.cpp"
1
#include "Test1.h"
2
3
extern WiFiServer MyServer(80);
4
5
void Set_WiFi (void) {
6
  MyServer.begin();
7
}
8
9
void Test1_Loop (void) {
10
}

Datei "Test1.h"
1
#include <ESP8266WiFi.h>
2
3
void Set_WiFi (void);

von A. Z. (donvido)


Lesenswert?

Datei "Test_WiFi_V1.ino"
1
#include "Test1.h"
2
3
WiFiServer MyServer(80);
4
5
void setup() {
6
7
  Set_WiFi ();
8
9
}
10
11
void loop() {
12
13
}

Datei "Test1.cpp"
1
#include "Test1.h"
2
3
void Set_WiFi (void) {
4
5
  MyServer.begin();
6
7
}
8
9
void Test1_Loop (void) {
10
11
}

Datei "Test1.h"
1
#include <ESP8266WiFi.h>
2
extern WiFiServer MyServer;
3
4
void Set_WiFi (void);

von Oliver S. (oliverso)


Lesenswert?

1
extern WiFiServer MyServer;

Oliver

von Harald H. (mirona)


Lesenswert?

Danke für die Antworten.
Diese haben mein Problem allerdings keiner Lösung zugeführt.
Folgende Fehlermeldungen kommt:

Test_WiFi_V1:3:12: error: redefinition of 'WiFiServer MyServer'
    3 | WiFiServer MyServer(80);
      |            ^~~~~~~~
In file included from 
/Users/###/Documents/Arduino/Test_WiFi_V1/Test_WiFi_V1.ino:1:
/Users/###/Documents/Arduino/Test_WiFi_V1/Test1.h:3:19: note: 
'WiFiServer MyServer' previously declared here
    3 | extern WiFiServer MyServer(80);
      |                   ^~~~~~~~
Bibliothek ESP8266WiFi in Version 1.0 im Ordner: 
/Users/###/Library/Arduino15/packages/esp8266/hardware/esp8266/3.0.2/lib 
raries/ESP8266WiFi   wird verwendet
exit status 1
redefinition of 'WiFiServer MyServer'

PS: Wie kann ich im Text Zeilenumbrüche einfügen?

von A. Z. (donvido)


Lesenswert?

Harald H. schrieb:
> Diese haben mein Problem allerdings keiner Lösung zugeführt.

Oliver S. schrieb:
> extern WiFiServer MyServer;

Harald H. schrieb:
> 'WiFiServer MyServer' previously declared here
>     3 | extern WiFiServer MyServer(80);

Dann vielleicht nochmal lesen?

von Harald H. (mirona)


Lesenswert?

Danke an donvido.
Jetzt klappt es.
Hat lange bei mir gedauert.
Ich war blöderweise nie auf den Gedanken gekommen, bei der externen 
Deklaration außer der Portnummer suchmal die Klammern wegzulassen.

Nochmal Danke!

von Oliver S. (oliverso)


Lesenswert?

Harald H. schrieb:
> Ich war blöderweise nie auf den Gedanken gekommen, bei der externen
> Deklaration außer der Portnummer suchmal die Klammern wegzulassen.

Es hilft letztendlich nichts, man muß die grundlegenden Konzepte einer 
Programmiersprache lernen. Von selber kommt man da halt nicht drauf.

Oliver

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.