INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Geschachtelte #includes
13.02.2016, 13:13 (Dieser Beitrag wurde zuletzt bearbeitet: 13.02.2016 14:56 von Bitklopfer.)
Beitrag #1
Geschachtelte #includes
Hi Leute
vielleicht könnt Ihr mir helfen: Bei meinem Projekt möchte ich geschachtelte Bibliotheken verwenden. Der Code lautet sinngemäß:
Sketch:
#include <lib1.h>
void setup()
.
.

Bibliothek lb1.h:
#define var1 1
#include <lib2.h>

Beim Compilieren bekomme ich die Meldung: "lib2.h no such file or directory". Wenn ich das "#include <lib2.h>" in den Sketch verschiebe, gibt es keine Probleme mit der #include-Auflösung.
Anscheinend kann der Preprozessor das 2. (geschachtelte) #include nicht auflösen.
Hat schon jemand was Ähnliches erfolgreich durchführen können?
Danke jedenfalls.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.02.2016, 14:45
Beitrag #2
RE: Geschahtelte #includes
Hallo und herzlich willkommen.

Ich vermute was du tun willst wird nicht machbar sein.
Die Bibliotheken werden vom Compiler beim compilieren/linken eingebunden und bereits dann in den Code geschrieben der zum Arduino übertragen wird.
Du willst eine weitere Bibliothek zur Laufzeit einbinden. Das ist nicht möglich weil der Arduino dann keinen Zugriff mehr auf die Bibliotheken hat.

Was ist denn Sinn und Zweck deines Vorhabens? Vielleicht gibt es dafür eine andere Lösung.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.02.2016, 15:14
Beitrag #3
RE: Geschachtelte #includes
Ich vermute, das wird gewollt verhindert.
Folgende Situation:
Lib A ruft Lib B auf
Lib B ruft Lib C auf
Und im Sketch wird nur noch Lib A includiert.

aber was passiert, wenn Lib C auch noch Lib A aufruft?
Wie soll der Compiler dann noch wissen wo oben und unten ist?
Dazu kommt:
Der Anwender arbeitet normalerweise nur im Sketch, nicht in den Libs.
Um den Durchblick noch zu haben, ist es wohl sinnvoller, wenn per include ganz klar ersichtlich ist, was alles eingebunden wird.

Binatone
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.02.2016, 15:16 (Dieser Beitrag wurde zuletzt bearbeitet: 13.02.2016 15:43 von Pit.)
Beitrag #4
RE: Geschahtelte #includes
"Ich vermute was du tun willst wird nicht machbar sein.
Die Bibliotheken werden vom Compiler beim compilieren/linken eingebunden und bereits dann in den Code geschrieben der zum Arduino übertragen wird.
Du willst eine weitere Bibliothek zur Laufzeit einbinden. Das ist nicht möglich weil der Arduino dann keinen Zugriff mehr auf die Bibliotheken hat."
--------
ein include wird ja nicht "zur Laufzeit" eingebunden, sondern dient dem Compiler lediglich dazu die Korrektheit des Codes vorab zu überprüfen. Zur Laufzeit eingebunden wird das Lib-Objekt nicht der include.

Ich vermute eher, die lib2.h steht nicht im richtigen Verzeichnis.
Evtl. steht die lib2.h ja im Verzeichnis in dem der Scetch steht und nicht im Lib-Verzeichnis.
In diesem Fall würde aus der Lib2 ja keine Lib erzeugt sondern der Lib2-Code wird Teil vom Scetch.
Die Lib wird ja getrennt übersetzt sobald ein Update erfolgt ist und dann zur Laufzeit eingebunden.
Lib2 muss also im Lib-Verzeichnis stehen und von der IDE zugefügt worden sein sonst findet die IDE keinen Pfad auf den include-file.

(13.02.2016 15:14)Binatone schrieb:  Ich vermute, das wird gewollt verhindert.
Folgende Situation:
Lib A ruft Lib B auf
Lib B ruft Lib C auf
Und im Sketch wird nur noch Lib A includiert.

aber was passiert, wenn Lib C auch noch Lib A aufruft?
Wie soll der Compiler dann noch wissen wo oben und unten ist?
Dazu kommt:
Der Anwender arbeitet normalerweise nur im Sketch, nicht in den Libs.
Um den Durchblick noch zu haben, ist es wohl sinnvoller, wenn per include ganz klar ersichtlich ist, was alles eingebunden wird.

Binatone

"Wie soll der Compiler dann noch wissen wo oben und unten ist?"

Der Compiler muss das überhaupt nicht wissen, weil er hier nur die grammatikalische Korrektheit überprüft.
Damit es nicht zu Doppeldeklarationen kommt sollten includeFiles immer mit einem "Abwehr"-ifdef geklammert sein.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.02.2016, 20:04
Beitrag #5
RE: Geschachtelte #includes
(13.02.2016 14:45)ardu_arne schrieb:  Hallo und herzlich willkommen.

Ich vermute was du tun willst wird nicht machbar sein.
Die Bibliotheken werden vom Compiler beim compilieren/linken eingebunden und bereits dann in den Code geschrieben der zum Arduino übertragen wird.
Du willst eine weitere Bibliothek zur Laufzeit einbinden. Das ist nicht möglich weil der Arduino dann keinen Zugriff mehr auf die Bibliotheken hat.

Was ist denn Sinn und Zweck deines Vorhabens? Vielleicht gibt es dafür eine andere Lösung.

Gruß
Arne
#includes werden beim Compilieren (besser gesagt vor dem Compilieren, nämlich durch den Preprozessor) aufgelöst und nicht zur Laufzeit. Der Preprozessor müßte korrekterweise den zuerst includierten Code auf weitere includes überprüfen und gegebenenfalls ebenfalls als Sourcecode einbinden. Tut er aber im Gegensatz zu anderen Systemen leider nicht.
Ad Pit: lib2.h steht im selben Verzeichnis wie lib1.h. Im Sketch kann er ja lib2.h auch auflösen (siehe Beschreibung des Problems).
Ad Binatone: Recursive includes werden in anderen Systemen über "include Guards" gecheckt und sollten kein Problem für geschachtelte includes darstellen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.02.2016, 22:06
Beitrag #6
RE: Geschachtelte #includes
Ad Pit: lib2.h steht im selben Verzeichnis wie lib1.h. Im Sketch kann er ja lib2.h auch auflösen (siehe Beschreibung des Problems).

also ich verwende auch verschachtelte Libs.
die Fehlermeldung sagt ja auch nicht, dass er keine verschachtelten includieren kann, sondern
"lib2.h no such file or directory"
er kann die lib2.h also nicht finden, dass er sie nicht inkludieren kann sagt er nicht.
ungefähr so ist meine vermutung:
wenn beide im scetch includiert werden dann hat er einen include-path auf das verzeichnis von lib1.h und findet darin (zufällig) auch die lib2.h
includiert man aber lib2.h in der lib1.h dann wird die lib1 ja separat kompiliert (ohne den scetch), der include-path für die lib2.h ist also nicht vorhanden.
ist die lib2.h jetzt eine eigene lib, dann hilft es ggf. sie auch in ein eigenes lib-unterverzeichnis zu stellen und in der ide zu importieren. durch den import in der ide sollte der lib-path auf die lib2.h zugefügt werden.

es stimmt natürlich schon, die arduino ide's sind etwas mit heisser nadel gestrickt und teils nicht ganz dem standard entsprechend.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
14.02.2016, 12:34
Beitrag #7
RE: Geschachtelte #includes
(13.02.2016 22:06)Pit schrieb:  Ad Pit: lib2.h steht im selben Verzeichnis wie lib1.h. Im Sketch kann er ja lib2.h auch auflösen (siehe Beschreibung des Problems).

also ich verwende auch verschachtelte Libs.
die Fehlermeldung sagt ja auch nicht, dass er keine verschachtelten includieren kann, sondern
"lib2.h no such file or directory"
er kann die lib2.h also nicht finden, dass er sie nicht inkludieren kann sagt er nicht.
ungefähr so ist meine vermutung:
wenn beide im scetch includiert werden dann hat er einen include-path auf das verzeichnis von lib1.h und findet darin (zufällig) auch die lib2.h
includiert man aber lib2.h in der lib1.h dann wird die lib1 ja separat kompiliert (ohne den scetch), der include-path für die lib2.h ist also nicht vorhanden.
ist die lib2.h jetzt eine eigene lib, dann hilft es ggf. sie auch in ein eigenes lib-unterverzeichnis zu stellen und in der ide zu importieren. durch den import in der ide sollte der lib-path auf die lib2.h zugefügt werden.

es stimmt natürlich schon, die arduino ide's sind etwas mit heisser nadel gestrickt und teils nicht ganz dem standard entsprechend.

was in deinem fall auch helfen könnte ist den pfad explizit anzugeben, also anstelle von
--
Bibliothek lb1.h:
#define var1 1
#include <lib2.h>
--
--
Bibliothek lb1.h:
#define var1 1
#include "lib2.h"
--
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Geschachtelte if-Anweisungen scritch 2 537 11.11.2014 09:46
Letzter Beitrag: scritch

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste