Linker-Error beim Einbinden eigener Bibliotheken

Hallo,

ich habe meinen Code in Visual Studio Code geschrieben und würde gern ein paar Teile in separate Bibliotheken auslagern.
Hier mein Code (Minimalbeispiel):

app.ino

#include "lib/tools.h"

void setup(){
  tools::init();
} 

void loop(){
}

tools.h

#ifndef TOOLS_H
  #define TOOLS_H

  #include <SPIFFS.h>

  class tools{
    public:
      static void init();
      ...

  };
#endif

tools.cpp

#include "tools.h"

void tools::init(){
  SPIFFS.begin(true);
}

Beim Kompilieren bekomme ich immer einen Linker-Error:

sketch\app.ino.cpp.o:(.literal._Z5setupv+0x0): undefined reference to `tools::init()’

sketch\app.ino.cpp.o: In function `setup()’:

…/app/app.ino:14: undefined reference to `tools::init()’

collect2.exe: error: ld returned 1 exit status

exit status 1

Wenn ich statt “lib/tools.h” die cpp-Datei “lib/tools.cpp” einbinde, dann funktioniert es, aber dann wird ja immer alles kompiliert (nach meinem Verständnis)…

Normalerweise muss ich das doch irgendwo beim Kompiler nochmal angeben, oder? Aber ich finde nichts…

Die Fehlerausgabe ist in der Arduino IDE und in Visual Studio Code die gleiche.

Kann mir jemand helfen?

Mir kommt spanisch vor. dass du das in einen lib Ordner gestopft hast...

Wo ist der?

Das ist mein eigener Ordner, in den ich mehrere Bibliotheken auslagern will.

Meine Ordnerstruktur:

/app
app.ino
/lib
tools.cpp
tools.h

Das funktioniert so nicht wirklich...
Bei Arduino hat die Library Struktur schon was Besonderes...
Der Arduino Builder möchte es anders
Es gibt ja auch kein Makefile, oder so.

Für Experimente ist folgende Struktur praktikabel
sketchbook/app
app.ino
tools.cpp
tools.h

Später dann als Library: (alter Stil)

sketchbook/app
app.ino

sketchbook/libraries/tools
tools.cpp
tools.h

Im nächsten Schritt den modernen Stil

https://www.arduino.cc/en/Hacking/LibraryTutorial

Alles klar, vielen Dank.
Genau das war der Fehler. Jetzt funktioniert es :slight_smile: