Forum: Compiler & IDEs undefined reference to `_ZN8GPIO_Pin2OnEh'


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Michael (oti)


Angehängte Dateien:

Lesenswert?

Bin gerade dabei einen mehrseitigen Code zu strukturieren (die 
Scrollerei nervt). Da ich kaum Ahnung von objektorientierter 
Programmierung habe, versuche ich mich an einem einfachen Script (Board 
isr ESP8266 mit PlatformIO). Der Compiler gibt immer Fehlermeldung 
undefined reference to `_ZN8GPIO_Pin2OnEh'
meine main:
1
//#include <Arduino.h>
2
#include "..\lib\GPIO.h"
3
GPIO_Pin LED;
4
void setup() {
5
  // pinMode(LED_BUILTIN, OUTPUT);
6
  LED.On (LED_BUILTIN);
7
}
8
void loop() {/*
9
  digitalWrite(LED_BUILTIN, HIGH);                        
10
  delay(250);                                                digitalWrite(LED_BUILTIN, LOW);                          
11
  delay(250);                                           
12
  */
13
}
meine h-Datei:
1
#if defined(ARDUINO) && ARDUINO >= 100
2
#include <arduino.h>
3
#else
4
#include "WProgram.h"
5
#endif
6
#ifndef __GPIO_h 
7
#define __GPIO_h
8
class GPIO_Pin { 
9
private:
10
     byte GPIO_Pin;
11
public:
12
   void On(byte GPIO_Pin); 
13
};
14
#endif
meine cpp-Datei
1
#include "..\lib\GPIO.h"
2
void GPIO_Pin::On(uint8_t GPIO_Pin){
3
    pinMode(GPIO_Pin, OUTPUT);
4
    digitalWrite (GPIO_Pin,HIGH);
5
}
Kann mir jemand auf die Sprünge helfen???

[Edit: code-tags hinzugefügt - Mod.]

: Bearbeitet durch Moderator
von Michael (oti)


Angehängte Dateien:

Lesenswert?

Michael schrieb:
gelang mir nicht die Dateien anzuhängen nun hier:

von Εrnst B. (ernst)


Angehängte Dateien:

Lesenswert?

Schau mal in deinen "lib"-Ordner, da sollte eine README vom Projekt-Init 
drinnen liegen, die dir sagt, dass du einen Unterordner unter lib 
brauchst.

d.H. pack dein GPIO.cpp /GPIO.h in einen "myGPIO" Ordner unterhalb von 
lib, pass die includes an, und es sollte passen.

BTW, ändert aber nix an deinem Problem:
Michael schrieb:
> #include "..\lib\GPIO.h"

ist unschön, der Pfad-Trenner für #includes ist "/", nicht "\".

Und vmtl. reicht dir später ein #include <GPIO.h>, wenn die Dateien im 
richtigen Ordner liegen.

Und der Header heißt "Arduino.h", nicht "arduino.h"...

und welchen sinn macht dein
byte GPIO_Pin;
Member in der Klasse, wenn du sie nie verwendest?


--> Im Anhang wie's zumindest kompiliert.

: Bearbeitet durch User
von Michael (oti)


Lesenswert?

Εrnst B. schrieb:
> d.H. pack dein GPIO.cpp /GPIO.h in einen "myGPIO" Ordner unterhalb von
> lib, pass die includes an, und es sollte passen.
das habe ich getan
Fehlermeldung: lib\MyGPIO\GPIO.cpp:1:10: fatal error: 
../lib/MyGPIO/GPIO.h: No such file or directory

> ist unschön, der Pfad-Trenner für #includes ist "/", nicht "\".
habe ich geändert, kommt vom DOS / ist besser, da keien ALTGR-Taste 
nötig.

> Und der Header heißt "Arduino.h", nicht "arduino.h"...
meine Nachlässigkeit

> und welchen sinn macht dein
> byte GPIO_Pin;
> Member in der Klasse, wenn du sie nie verwendest?
 ist für später

> Und vmtl. reicht dir später ein #include <GPIO.h>, wenn die Dateien im
> richtigen Ordner liegen.

Die Struktur habe ich nicht verstanden. Welcher Ordner ist denn der 
richtige? Habe die 2 Dateien auch in den include Ordner gepackt, mit der 
selben Fehlermeldung. Der Editor bietet sie mir zum auswählen an.

Nachtrag: liegen sie im Include-Ordner lautet die Fehlermeldung
c:/users/otistoshiba/.platformio/packages/toolchain-xtensa/bin/../lib/gc 
c/xtensa-lx106-elf/10.3.0/../../../../xtensa-lx106-elf/bin/ld.exe: 
.pio\build\nodemcu\src\main.cpp.o:(.text.setup+0x4): undefined reference 
to `_ZN8GPIO_Pin2OnEh'
collect2.exe: error: ld returned 1 exit status
*** [.pio\build\nodemcu\firmware.elf] Error 1

Nachtrag: liegen sie im selben Ordner wie main, läuft der Compiler 
durch.
Da habe ich das mit den Ordnern wohl überhaupt nicht verstanden.

Thx erstmal

: Bearbeitet durch User
von Jim M. (turboj)


Lesenswert?

Die GPIO.o die vom GPIO.cpp erstellt wurde wird aus irgendeinem Grund 
nicht mit an den Linker verfüttert.

Mach mal in die GPIO.cpp ein
1
#error 1

rein, dann siehst Du ob das überhaupt mit kompiliert wird oder nicht...

von Michael (oti)


Lesenswert?

Jim M. schrieb:
> Die GPIO.o die vom GPIO.cpp erstellt wurde wird aus irgendeinem Grund
> nicht mit an den Linker verfüttert.
>
> Mach mal in die GPIO.cpp ein
>
> [c]
> #error 1

undefined reference to `_ZN8GPIO_Pin3OffEh' bleibt als Fehler. 
Kompiliert sauber wenn die Dateien im main.cpp Ordner liegen. Der Editor 
zeigt mir aber dem / die weiteren Ordner/Dateien zu Auswählen an.
Was bewirkt die Direktive #error1

thx

Nachtrag: #error-Direktive wird verwendet, um den Kompilierungsvorgang 
mit einer (optionalen) Fehlermeldung abzubrechen habe ich gelesen. Ist 
meine Schlußfolgerung richtig, dass der Compiler das cpp nicht 
compiliert, ansonsten würde der eine 1 als Fehlermeldung ausgeben?

: 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.