Hallo zusammen
Ich habe mir sloeber heruntergeladen und das Paket für den ESP8266
installiert. Soweit so gut.
Nun versuche ich, elm chans FatFS zu integrieren.
Leider bekomme ich immer Meldungen wie:
1
sloeber-workspace\testESP\Release/..\fs/ff.c:3476: undefined reference to `disk_ioctl'
Die Funktionen sind aber vorhanden und Eclipse kennt sie auch
(CTRL+Click) zudem habe ich die ordner zu den IncludePfaden hinzugefügt.
Nach etwas google hab ich dies gefunden:
https://github.com/Sloeber/arduino-eclipse-plugin/issues/579
Nun verstehe ich dies so, dass ich all meinen C-Code in das .ino file
inkludieren müsste.
Für mich nicht machbar.
Gibt es noch andere Möglichkeiten? Das .c file in .cpp umbenennen?
Danke schonmal
Das ist eine Linker-Fehlermeldung.
Wenn die Funktion vorhanden ist, dann wird das am name mangling
liegen, d.h. Deine in einem C++-Modul implementierte Funktion heißt für
den Linker anders als sie hieße, wenn sie in einem C-Modul implementiert
worden wäre.
Die Definition (d.h. Implementierung) der Funktion muss aber mit
C-Linkage erfolgen, also in "extern C" verpacken.
Rufus Τ. F. schrieb:> extern C
Danke.
Wo soll ich denn das extern "C" {} platzieren?
Ich habe mehrere *.c files.
Soll ich nun das gesamte File von Anfang bis Ende einpacken?
Oder soll ich das gesamte header file einpacken?
Rufus Τ. F. schrieb:> Was bedeutet das "x" im Project Explorer?
Das bedeutet dass es dort errors gab.
Der erste Error ist jener, welchen ich oben gepostet habe.
Rufus Τ. F. schrieb:> Die Definition (d.h. Implementierung) der Funktion muss aber mit> C-Linkage erfolgen, also in "extern C" verpacken.
Die Definition erfolgt ja mit C-Linkage, da sie in einem C-Modul
implementiert sind.
Das extern "C" gehört an die im C++ Teil verwendeten Deklarationen
also
1
extern"C"voiddisk_ioctl();
Falls die Funktion auf C-Ebene als void disk_ioctl (void) implementiert
ist. Ditto für globale Daten. Oder in einen extern "C" {} packen.
Johann L. schrieb:> Die Definition erfolgt ja mit C-Linkage, da sie in einem C-Modul> implementiert sind.
Ja, das ist soweit klar. Wenn aber ein C-Modul auf ein Symbol in einem
C++-Modul zugreifen soll, ist es nötig, dieses Symbol mit C-Linkage zu
erzeugen.
Die eingangs genannte Fehlermeldung
1
sloeber-workspace\testESP\Release/..\fs/ff.c:3476: undefined reference to `disk_ioctl'
lässt darauf schließen, daß hier ein C-Modul (ff.c) auf ein Symbol
namens "disk_ioctl" zugreifen will, und das wiederum ließ mich vermuten,
daß das in C++-Code steckt, was auch eine *.ino-Datei sein kann.
Johann L. schrieb:> Das extern "C" gehört an die im C++ Teil verwendeten Deklarationen> also
hmmm... Wie muss ich das verstehen?
die ff.h enthält die C-Deklarationen der ff.c
in der ff.c wird die diskio.h inkludiert welche die C-Deklarationen der
diskio.c enthält.
Die Fehlermeldung bezieht sich auf eine Funktion welche sich in diskio.c
befindet (dies war der erste fehlert. Die darauffolgenden melden einfach
andere Funktionen innerhalb der diskio.c)
die ff.h habe ich per #include in die testESP.ino inkludiert.
Wo würdet ihr also die extern "C" {} machen?
Rufus Τ. F. schrieb:> Wenn aber ein C-Modul auf ein Symbol in einem> C++-Modul zugreifen soll, ist es nötig, dieses Symbol mit C-Linkage zu> erzeugen.
Da die ff.c ein reines C-Modul ist und die ff.c auf die diskctl in
diskio.c zugreiffen möchte, sehe ich das Problem nicht ganz.
Denn eigentlich sind ja beides reine C-Module.
Ich rufe in der testESP.ino noch eine Funktion aus der ff.h auf.
Müsste ich evtl. die ff.h in extern "C" {} packen?
Dann scheint die diskio.c nicht zu Deinem Projekt hinzugefügt worden zu
sein.
Naja, oder wie Dein Screenshot verrät, ließ sie sich nicht korrekt
übersetzen.
Interessant wäre jetzt natürlich die /Compiler/-Fehlermeldung, die beim
Übersetzen von diskio.c ausgegeben wird.
Die Linkerfehlermeldungen sind erst später relevant.
Danke für deine Antwort.
Rufus Τ. F. schrieb:> Dann scheint die diskio.c nicht zu Deinem Projekt hinzugefügt worden zu> sein.
Eclipse kennt die diskio.c aber.
Den fs ordner habe ich auch in den include paths hinzugefügt.
Hier die gesamten Fehlermeldungen.
1
"C:\\sloeber\\arduinoPlugin\\tools\\make\\make" all
Das sind die Meldungen des Linkeraufrufs.
Dem wird diskio.c.o als zu linkende Datei übergeben, wie auch etliche
andere Dateien, insofern scheint das auch korrekt zu sein.
Den Compileraufruf sehe ich nicht. Erstaunlicherweise werden auch
Symbole bemäkelt, die in diskio.c verwendet werden, wie man am Schluss
erkennen kann.
Irgendwie scheint dieses Buildsystem ... merkwürdig zu sein.
Zeig mal die im Moment von Dir verwendeten Sourcen, d.h. insbesondere
Deine diskio.c
Rufus Τ. F. schrieb:> Zeig mal die im Moment von Dir verwendeten Sourcen, d.h. insbesondere> Deine diskio.c
Gerne.
Anbei die verschiedenen Sourcen.
Rufus Τ. F. schrieb:> Irgendwie scheint dieses Buildsystem ... merkwürdig zu sein.
Das habe ich leider bei dem "sloeber" system auch schon bemerkt.
Wollte dem ganzen aber nochmals eine Chance geben, da ich gerne etwas
umfangreicher mit dem ESP8266 auf Arduinobasis arbeiten würde.
Da hätte ich gerne eine IDE wie Eclipse oder ähnliches gehabt.
Deshalb sloeber.
Rolf M. schrieb:> Ändere mal die Reihenfolge beim Linken, also erst ff und dann diskio.
Das ist ziemlich sicher nicht die Ursache des Problems. Das Ändern der
Reihenfolge ist nur bei Verwendung von "weak symbols" relevant, die aber
nur beim Einsatz von Libraries (*.a) eine Bedeutung haben.
Zu "diskio.c"
Wo wird _USE_IOCTL definiert?
Wenn das nicht definiert ist, gibt es die Funktion disk_ioctl nicht.
Rufus Τ. F. schrieb:> Zu "diskio.c">> Wo wird _USE_IOCTL definiert?
Sehr gute Frage...
Habe dies nun definiert und lasse den Build nochmals laufen.
Wäre natürlich super, wenns nur das war. Andererseits auch schade um die
vielen Zeit, wegen nur einem define.
Ja, das war jenes problem.
Nun habe ich nur noch ein Problem.
in der diskio.c wird auf eine funktion der flash.cpp zugegriffen.
Da die flash.cpp ja eine C++ Datei ist, scheint es so als ob ich nicht
von der C-Funktion auf diese vermeintliche C++ funktion zugreifen kann.
Kommmt hier nun das extern "C" {} ins spiel?
EDIT:
Wenn ich
1
extern"C"
2
{
in der flash.h am Anfang platziere und unten die Klammer schliesse,
bekomme ich den Fehler:
1
..\fs\flash.h:14:8: error: expected identifier or '(' before string constant
Patrik S. schrieb:> Kommmt hier nun das extern "C" {} ins spiel?
So ist es.
> Wenn ich ...
Du musst das "extern C" in der Headerdatei wiederum in einem
#ifdef-Block verpacken:
1
#ifdef __cplusplus
2
extern"C"{
3
#endif
4
5
...
6
...
7
...
8
9
#ifdef __cplusplus
10
}
11
#endif
Das muss in der Headerdatei geschehen, damit diese sowohl aus dem
Kontext eines C-Moduls als auch aus dem Kontext eines C++-Moduls
verstanden wird.
Nötig ist das nur bei den Symbolen, die für das C-Modul von Interesse
sind; Du kannst also die restlichen C++-Deklarationen auch vor dem
C-Modul verstecken.
Die Funktion(en), die aus C heraus aufgerufen werden sollen, müssen auch
im Code mit "extern C" gekapselt werden.
Patrik S. schrieb:> Die Funktionen sind aber vorhanden und Eclipse kennt sie auch> (CTRL+Click) zudem habe ich die ordner zu den IncludePfaden hinzugefügt.
Für mich klingt das, als wenn die zugehörigen C-Files gar nicht
compiliert werden, was nicht verwunderlich wäre, wenn die im
Include-PATH liegen.
Harry L. schrieb:> Für mich klingt das, als wenn die zugehörigen C-Files gar nicht> compiliert werden,
Sie werden compiliert, sieh Dir den weiter oben geposteten Linkeraufruf
an. Würden sie nicht compiliert, aber dem Linker übergeben werden, würde
der Linker entsprechend motzen, daß er Dateien und nicht Symbole nicht
finden kann.