Forum: Compiler & IDEs Compilerfehler wegen Deklaration fs::File


von Peter (macpit69)


Lesenswert?

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 {
      |       ^~~~

von Michael D. (nospam2000)


Lesenswert?

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
von Peter (macpit69)


Lesenswert?

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

von DPA (Gast)


Lesenswert?

Das ist kein C. Das ist C++.

von Kaj (Gast)


Lesenswert?

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.

von Peter (macpit69)


Lesenswert?

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

von Rolf M. (rmagnus)


Lesenswert?

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.

von Peter (macpit69)


Lesenswert?

Nein er hat natürlich Meldungen gebracht…die siehst du ja oben.

von Rolf M. (rmagnus)


Lesenswert?

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
von Peter (macpit69)


Lesenswert?

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

von Anonymous (Gast)


Lesenswert?

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.

von Anonymous (Gast)


Lesenswert?

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

von Peter (macpit69)


Lesenswert?

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
von Εrnst B. (ernst)


Lesenswert?

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
Noch kein Account? Hier anmelden.