Hallo Ich versuche aus auf einem Demos D1 Mini (ESP8266) aus dem Filesystem eine BMP in das Programm einzulesen. Ich habe den Speicher von 4MB erfolgreich in 3MB für das FS (LittleFS) und 1MB für das Programm aufgeteilt und eine BMP Datei darin verstaut. Ich kann nun in meinem Programm die Datei in dem LittleFS auch auch anzeigen. Ich kann die BMP-Datei mit einem Konverter in Bytes konvertiert im PROGMEM speichern und auf dem TFT (ILI9341) mit den entsprechenden Funktionen aus der Adafruit-Library anzeigen lassen. Allerdings würde ich lieber die BMP aus dem LittleFS einlesen und anzeigen lassen. Das Problem ist nun dass die dafür benötigten Libraries sich wohl "beißen". Die LittleFS Libraries definiert wohl die Klasse fs::File neu obwohl diese in einer der anderen LIBs schon drin ist - so sieht es jedenfalls für mich aus. Wer kann mir sagen wo das Problem genau liegt ? *** [.pio/build/d1_mini_pro/lib0ec/Adafruit ImageReader Library/Adafruit_ImageReader_EPD.cpp.o] Error 1 Compiling .pio/build/d1_mini_pro/FrameworkArduino/reboot_uart_dwnld.cpp.o In file included from /Users/peter/.platformio/packages/framework-arduinoespressif8266/librari es/LittleFS/src/LittleFS.h:31, from src/loadbmp_test.cpp:12: /Users/peter/.platformio/packages/framework-arduinoespressif8266/cores/e sp8266/FS.h:263:11: error: 'class fs::File' conflicts with a previous declaration 263 | using fs::File; | ^~~~ In file included from .pio/libdeps/d1_mini_pro/SdFat - Adafruit Fork/src/FatLib/FatLib.h:27, from .pio/libdeps/d1_mini_pro/SdFat - Adafruit Fork/src/SdFat.h:33, from .pio/libdeps/d1_mini_pro/Adafruit SPIFlash/src/Adafruit_SPIFlash.h:32, from .pio/libdeps/d1_mini_pro/Adafruit ImageReader Library/Adafruit_ImageReader.h:18, from src/loadbmp_test.cpp:5: .pio/libdeps/d1_mini_pro/SdFat - Adafruit Fork/src/FatLib/ArduinoFiles.h:122:7: note: previous declaration 'class File' 122 | class File : public FatFile, public Stream { | ^~~~
Peter schrieb: > 263 | using fs::File; Lass das weg und verwende explizit überall fs::File oder den namespace der anderen "File" Klasse den sie hoffentlicht hat und der hoffentlich nicht auch "fs" heißt. Genau aus diesem Grund wurden namespaces erfunden und "using namespace" ist zwar auf den ersten Blick verlockend, aber irgendwann trifft es einen doch. Michael
:
Bearbeitet durch User
Hallo Michael Also ich bin nicht der Profi was C angeht. Ich habe aber folgendes schon erfolglos verwsucht ==> fs::File file = root.openFile("r"); <== Der Konflikt kommt aus einer der Bibliotheken, ich kann aber nicht genau erkennen welche schuld ist. lg Peter
Peter schrieb: > FS (LittleFS) Peter schrieb: > SdFat - Adafruit > Fork/src/FatLib/FatLib.h Naja, bei 2 Dateisystem Libs ist es sehr wahrscheinlich das die Klasse/der Namespace gleich heißen.
Lieber DPA - keine Ahnung wie ich Deinen Kommentar jetzt einordner oder verwerten könnte. @kaj Ja das ist wohl wahr - allerdings wird die SDFat nicht von mir sondern von der Adafruit_SPIDlash.h geladen welche wiederum von der Adafruit_Imagereader.h geladen wird. Und die Adafruit_ImageReader.h lade ich weil ich ich genau diese brauche um eine BMP aus einer Datei zu lesen und auf den TFT zu schreiben. Ich glaube ich schieße das LittleFS in den Wind und nutze das SPIFFS. lg
Peter schrieb: > Also ich bin nicht der Profi was C angeht. > > Ich habe aber folgendes schon erfolglos verwsucht > ==> > fs::File file = root.openFile("r"); > <== Was heißt "erfolglos"? Der Compiler hat sicher nicht nur "kein Erfolg" ausgegeben.
Nein er hat natürlich Meldungen gebracht…die siehst du ja oben.
Peter schrieb: > Nein er hat natürlich Meldungen gebracht…die siehst du ja oben. Also die selben Meldungen wie oben? Du zeigst halt nicht viel. Erst nur eine Reihe Fehlermeldungen, aber ohne den Code, der sie verursacht, und weiter unten dann eine einzelne Zeile Code, die auch "erfolglos" war, aber ohne zu sagen, in welcher Form sie das war. Ich habe den Header mal ergoogelt und dort (wohl nicht exakt in der gleichen Version) gefunden: https://github.com/esp8266/Arduino/blob/master/cores/esp8266/FS.h Die Zeilennummern unterschieden sich leicht, aber ich konnte dort folgendes finden:
1 | #ifndef FS_NO_GLOBALS
|
2 | using fs::FS; |
3 | using fs::File; |
4 | using fs::Dir; |
5 | using fs::SeekMode; |
6 | using fs::SeekSet; |
7 | using fs::SeekCur; |
8 | using fs::SeekEnd; |
9 | using fs::FSInfo; |
10 | using fs::FSConfig; |
11 | using fs::SPIFFSConfig; |
12 | #endif //FS_NO_GLOBALS
|
Das legt nahe, dass die Definition eines Makros mit Namen FS_NO_GLOBALS z.B. per Compiler-Flag helfen könnte.
:
Bearbeitet durch User
Hallo Rolf Danke für die Hilfe. Für den Fehler bedarf es keines Codes denn der kommt schon dann wenn man die Bibliothek SdFat.h und anschließend die FS.h lädt. Lässt man die FS.h weg dann geht es. Allerdings brauche ich die FS.h damit ich SPIFFS benutzen kann. Setze ich diese Compiler-Flag in meinem Main? lg Peter
Peter schrieb: > Lieber DPA - keine Ahnung wie ich Deinen Kommentar jetzt einordner oder > verwerten könnte. Er meint: da es hier offensichtlich um C++ handelt, spielt deine Einschätzung zu C-Kenntnissen keine Rolle.
Peter schrieb: > Für den Fehler bedarf es keines Codes denn der kommt schon dann wenn man > die Bibliothek SdFat.h und anschließend die FS.h lädt. Was bedeutet denn bei dir "laden". Du öffnest sie in Notepad++ und dann kommt die eingangs zu sehende Fehlermeldung...? Glaube ich nicht. Du hast eine bis auf zwei #include eine leere Source-Datei? Das wäre aber Code, den du nicht zeigst. Peter schrieb: > Setze ich diese Compiler-Flag in meinem Main? Nein, beim Aufruf vom Compiler. Zum Beispiel so in der Art: > g++ main.cc -DFS_NO_GLOBALS
Okay ich konkretisiere mal etwas. Ich benutze VS-Code mit platformio um ESP8266 und ESP32 zu programmieren. Das reine "includen" der besagten LIBs führt dazu dass der Compiler sieht dass eine LIB einen Namespace benutzt den es in einer anderen LIB schon gibt. Da sagt der Compiler dann "redefinition" und mag das nicht. Die Compilerkonstante von Rolf in meinem main.cpp direkt am Anfang gesetzt hat den besagten Fehler tatsächlich korrigiert. Jetzt kämpfe ich mit anderen Problemen. Dabei möchte ich einfach nur eine Datei aus dem als SPIFFS angelegten Teil des Speichers eine BMP-Datei laden und auf dem TFT darstellen. Ich nutze gerne die LIBs von Adafruit - wie bestimmt viele ESP-Coder. Leider hat die Adafruit_ImageReader.h eine Abhängigkeit zu der Adafruit_SPIFlash.h welche wiederum die SdFat.h braucht und genau die beißt sich mit FS.h die ich für das SPIFFS brauche.......ganz schönes Elend..... Ist eben alles etwas vie lauf einmal....aber mit der Zeit wird das schon werden.
:
Bearbeitet durch User
Peter schrieb: > Ich benutze VS-Code mit platformio dann gehört das als "-DFS_NO_GLOBALS" in die plattformio.ini als "build_flags" Aber mach dir nicht zuviele Hoffnungen. Beim Zusammenstöpseln von vielen 3rd-Party-Libraries wirst du immer wieder auf Kombinationen treffen, die nicht zusammen spielen möchten.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.