Verschiedene Probleme beim Einbinden von header-files

Hallo,
ich wollte ein größeres Projekt aufsetzen mit code, der von SquareLine kommt. Die Probleme liegen wohl an den Header-Files... Also - Testprojekt um es zu verstehen...
Datei ....\Gerdh\Arduino\Test_FileStructure\Test_FileStructure.ino

#include "fs1/fs1.h"
void setup() {
  Serial.begin(9600);
}
void loop() {
  greet();
}

Datei ....\Gerdh\Arduino\Test_FileStructure\fs1\fs1.h

#ifndef _FS1_H_
#define _FS1_H_
#include <Arduino.h>
  void greet();
#endif

datei ....\Gerdh\Arduino\Test_FileStructure\fs1\fs1.c oder .cpp - selber Fehler

#include "fs1.h"
#include <Arduino.h>
void greet(){
  Serial.println("Hello World");
}

Compile error:

C:\Users\gerdh\AppData\Local\Temp\arduino\sketches\F2457D2481368A376AB7A5C0FD28DC2D\sketch\Test_File_Structure.ino.cpp.o:(.text.loop+0x0): undefined reference to `_Z5greetv'
collect2.exe: error: ld returned 1 exit status

exit status 1

Compilation error: exit status 1

Wenn die Dateien alle im selben Verzeichnis wie die .ino liegen - läuft es.

Ich habe leider keine deutsche Anleitung für das Einbinden eigener .h - .c - Dateien gefunden.

Gerd

  1. Wo hast Du sie denn liegen, wenn sie nicht im ino-Ordner liegen?
  2. Was hindert Dich daran, sie in den ino-Ordner zu legen oder sollen es allgemein verwendbare Libs werden?

Gruß Tommy

Hallo,

schau dir als Bsp. eine nachinstallierte Lib an. In dem übergeordneten Baum muss dann deine liegen. Üblicherweise der libraries Ordner nach sketchbook.

Wichtig sind erstmal
src
library.properties

examples ist zweitrangig, im Zweifel leer lassen oder nicht anlegen
keywords.txt ist auch erstmal zweitrangig

in src liegen dann .h und .cpp Datei

Die library.properties musste editieren. Davon sind wiederum diese 3 Zeilen wichtig. Alle anderen sind Beiwerk. Ohne fehlerfreie library.properties findet die IDE deine Lib nicht.
name=FS1
includes=FS1.h
architectures=*

Oder das Bsp. in den libraries Ordner entpacken wo die Nachinstallierten oder eigene Libs liegen. IDE schließen und öffnen, FS1 Bsp. laden, sollte kompilieren. Getestet mit IDE 1.8.19 & Mega2560.
FS1.zip (1,7 KB)

Hallo,
ich hatte die Dateien im Unterordner fs1 liegen - steht aber im Ursprungs-Post. Leider bin ich schon ein Stück weiter... Dateien liegen jetzt im selben Pfad, als Board ist jetzt nicht mehr der NODEMCU sondern der später zum Einsatz kommende ESP32S3. Der Fehler ist jetzt der selbe, wie im Hauptprojekt.

C:\Users\gerdh\OneDrive\Dokumente\Arduino\Test_File_Structure\fs1.c: In function 'greet':
C:\Users\gerdh\OneDrive\Dokumente\Arduino\Test_File_Structure\fs1.c:4:3: error: 'Serial' undeclared (first use in this function); did you mean 'erfcl'?
   Serial.println("Hello World");
   ^~~~~~
   erfcl
C:\Users\gerdh\OneDrive\Dokumente\Arduino\Test_File_Structure\fs1.c:4:3: note: each undeclared identifier is reported only once for each function it appears in

exit status 1

Compilation error: 'Serial' undeclared (first use in this function); did you mean 'erfcl'?

In meinen ersten Tests ist es mit der Zeile
#include <Arduino.h>

verschwunden. Aber mit dem Board ESP32S3 wieder da - welche Standardbibliothek muss ich einbinden? Weil... mein Serial.begin(); nimmt er ja auch, ohne dass ich etwas eingebunden habe.

Gruß
Gerd

Nochmal die Frage: Soll es eine allgemein verwendbare Lib werden, dann gehe nach dem Vorschlag von @Doc_Arduino vor, aber mit cpp anstelle von c

Soll es das nicht werden, dann lagere die Teile in ino-Dateien aus.

Gruß Tommy

Hallo,
es soll keine allgemeine Bibliothek werden. Es ist eine von SquareLine erstellte UI direkt für das Projekt. Squareline erstellt mehrere ui_.h und zugehörige ui_.c
Eine davon ist die ui_events.h, und .c dort habe ich meine Funktionen - und stolpere über so "einfache" Sachen wie Serial.println().

// This file was generated by SquareLine Studio
// SquareLine Studio version: SquareLine Studio 1.4.0
// LVGL version: 8.3.6
// Project name: Wetter
#include <Arduino.h>

#ifndef _UI_EVENTS_H
#define _UI_EVENTS_H

#ifdef __cplusplus
extern "C" {
#endif

void WLAN_On_Off(lv_event_t * e);
void MQTT_On_Off(lv_event_t * e);
void end_Program(lv_event_t * e);

#ifdef __cplusplus
} /*extern "C"*/
#endif

#endif
// This file was generated by SquareLine Studio
// SquareLine Studio version: SquareLine Studio 1.4.0
// LVGL version: 8.3.6
// Project name: Wetter

#include "ui.h"
#include <Arduino.h>

void WLAN_On_Off(lv_event_t * e)
{
	// Your code here
  Serial.println("WLAN");
}

void MQTT_On_Off(lv_event_t * e)
{
	// Your code here
  Serial.println("MQTT");
}

void end_Program(lv_event_t * e)
{
	// Your code here
  Serial.println("Ende");
}

Du meinst also, ich habe dann mehrere .ino-Dateien in einem Projekt?
Ich teste weiter...
Grüße

Gerd

Gib mal einen link zu dem, was DU hast, damit man erstmal eine Vorstellung bekommt, auf welcher Basis das ist.
Und dann beschreib mal, was Du damit vorhast. Und vor allem, was an Serial.println() nicht geht...

Fehler:

C:\Users\gerdh\OneDrive\Dokumente\Arduino\Test_File_Structure\fs1.c: In function 'greet':
C:\Users\gerdh\OneDrive\Dokumente\Arduino\Test_File_Structure\fs1.c:4:3: error: 'Serial' undeclared (first use in this function); did you mean 'erfcl'?
   Serial.println("Hello World");
   ^~~~~~
   erfcl
C:\Users\gerdh\OneDrive\Dokumente\Arduino\Test_File_Structure\fs1.c:4:3: note: each undeclared identifier is reported only once for each function it appears in

exit status 1

Compilation error: 'Serial' undeclared (first use in this function); did you mean 'erfcl'?

Code in Post #6. Wobei das #include <Arduino.h> auf meinem Mist gewachsen ist, aber nicht zielführend war.

Hallo,

für alle anderen. Squareline Studio ist eine Software mit der man eigene GUIs für sein Display erstellen kann. Testzeitraum läuft nach 30 Tagen ab. Squareline erstellt ein Wust an Dateien die man dann einbinden muss. Da muss ich passen.

Und der Rest von uns wohl auch.

Gruß Tommy

Das Problem liegt ja nicht wirklich an der ui-Software. Wie schon geschrieben, habe ich das Problem ja mit "billigen" Testdateien nachgestellt.
die .ino mit einem Functionsaufruf greet();
die .h mit einem Prototyp void greet();
und die .c mit der Funktionsdeklaration void greet() { Serial.println("Hello World"); }
alle drei Dateien in einem Verzeichnis.
Mit dem Nodemcu lässt es sich compilieren, mit dem ESP32S3 kommt der oben geschriebene Fehler. Da fehlt bestimmt nur eine Standardbibliothek, aber ich habe keine Idee.

FS1.zip (1.7 KB)

Das unveränderte Projekt compiliert und läuft, sobald ich die Serial.println - Zeilen einbaue meckert der Compiler über Serial.println.

Grüße

Gerd

Hallo,

das .zip ist doch meins von oben unverändert?
Das Entpacke in den libraries Ordern nach dem sketchbook Ordner.
Sieht dann so aus. ...\sketchbook\libraries\FS1\src
dann muss das kompilieren. Das wäre dann eine normale eigene Lib.
Ansonsten schalte einmal die komplette Ausgabe der Fehlermeldungen ein und zeige diese. Die rot markierten Zeilen sind wichtig, die anderen nützlich.

Das ist doch auch grober Unsinn!

Der Grund:
Serial ist eine instanziierte Klasse.
Sowas gibts in C nicht.

Kann also gar nicht klappen.

Zudem ist es eine Definition, die Deklaration findet sich in der *.h

Hallo,

der TO schreibt undeutlich. Er schreibt ganz sicher etwas von .c meint aber .cpp. In der Lib für ihn habe ich nur .h und .cpp drin. Der Fehler muss woanders liegen. Mit Arduino.h Inkludierung wird ja alles zur Verfügung gestellt.
Eine Vermutung in den Raum gestellt. Kann es am Pfad zu OnDrive liegen? Mit Netzlaufwerken ist da ja immer so eine Sache. Das der TO für den einen ESP lokal testet und für den anderen mit Internet? Mir sind hier ehrlich gesagt zu viele mögliche Baustellen auf einmal, die ich schwer aufdröseln kann.

Hm....
@gheber
Besser: In der IDE: SKETCH - BIBLIOTHEK EINBINDEN - ZIP-BIBLIOTHEK HINZUFÜGEN -> zip-File auswählen,

Einen Moment warten, bis das integriert ist.
Dann DATEI - BEISPIELE - FS1 - EXAMPLE - TEST

Und tataa!

1 Like

Hallo,

das ist die bessere/einfachere Methode. Danke.
Bin gespannt was bei seinem Nodemcu richtig und was bei seinem ESP32S3 schief läuft.

1 Like

Hallo,

danke für die Antworten. Das mit dem onedrive ist mir auch aufgefallen, deshalb ist das Zeug inzwischen deinstalliert. Unter C:\Benutzer\OneDrive existiert es weiterhin und enthält Verweise auf Dokumente, Downloads u.s.w. Aber das war auch nicht das Problem. Das Problem war tatsächlich meine Unkenntnis der Unterschiede C und CPP. Das Auslagern in den lib-Ordner funktioniert, im selben Ordner wie die .ino nicht.

Allerdings werde ich trotzdem die Arduino-IDE ad acta legen. Der Grund dafür ist einfach erklärt. Mein Projekt compiliert mit der Arduino-IDE 15-20 Minuten - egal ob ich eine einzige Zeile ändere oder komplett alles umschreibe. Mit platformio unter Visual Studio Code comiliert das Gleiche in 210 Sekunden, bei kleinen Änderungen wird nur das Nötigste nachcompiliert, also vielleicht 40 Sekunden.

schönen Abend noch.

Gerd

Man musste alle Pfade ändern, habe aufgegeben, im Netz habe auch nichts gefunden, oder falsch gesucht.

Das wollten wir dir eigentlich erklären. Dort wo deine Projekt.ino liegt, liegen wenn dann weitere .ino Dateien die du in den Tabs siehst. Wenn du allerdings eigenmächtig die Lib Dateien in den Projektordner kopierst kann das nicht funktionieren.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.