Sebastian M. schrieb:
> Ich entwickle aktuell einen Damon der auf einen RaspberryPI läuft und
> verwende die externe Bib wiringPi.
> Das Programm schreibe ich auf einer Windows Maschine via git landen die
> Sourcen auf dem PI wo ich es compiliere und ausführe.
Ein bißchen kompliziert, nicht? Warum nutzt du nicht irgendein Netzwerk-
Filesystem? Oder gleich eine IDE, die auf dem Pi läuft?
> Jetzt bin ich auf ein Problem gestoßen, dass ich aus anderen
> Entwicklungen für embedded systems auch kenne. Wie binde ich eine fremde
> Bib richtig ein?
Was verstehst du unter "einbinden"?
In C/C++ ruft man Funktionen aus einer (fremden) Library auf. Dazu muß
der Compiler die Signaturen der Funktionen kennen und evtl. auch
spezifische Datentypen. Zu diesem Zweck #includiert man ein Headerfile,
das Bestandteil der Library ist.
Spätestens beim Linken deines Programms muß dann auch der Objektcode der
Library vorliegen. Entweder als Archiv (libXXX.a) oder als shared object
(libXXX.so).
Ergo: sowohl der Compiler als auch der Linker brauchen Zugriff auf die
Library. Wenn du auf dem Pi compilierst, muß die Lib dort also
vorliegen. Entweder als Teil deines Projekts oder als System-Library.
Bei libwiringpi vermutlich letzteres.
> Für C / C++ gibt es Makefile, allerdings "verstehe" ich das Konzept zum
> einbinden externe bibs nicht.
Das hat mit dem Makefile auch nur sehr am Rande zu tun.
Eigentlich geht es nur darum, dem Compiler bzw. Linker ein paar
Kommandozeilenoptionen mitzugeben.
Compiler: -I ... für ein (weiteres) Includeverzeichnis, wo er nach
Headerfiles sucht.
Linker: -L ... als Suchverzeichnis für Libraries und -l ... einmal für
jede Library, die dazugelinkt werden soll.
> Mit diesem Befehl compiliere ich ein blink beispiel:
>
1 | > gcc -Wall -o blink blink.c -pthread -lwiringPi -lm -lrt -lcrypt
|
2 | >
|
Weder -I noch -L sind gesetzt, also findet der Compiler die Hederfiles
nur in den Standard-Verzeichnissen (/include, /usr/include, ...) und der
Linker sucht auch nur in den Standard-Verzeichnissen (/lib, /usr/lib,
...). Außerdem werden libwiringPi, libm, librt und libcrypt dazugelinkt.
Die Libs können entweder als statische Libs vorliegen (libwiringPi.a,
libm.a ...) und/oder als shared Libraries (libwiringPi.so, libm.so ...).
Wenn beides, dann bevorzugt der Linker die shared Lib.
> Vorausgesetzt man hat im Vorfeld wiringPI installiert die anderen bibs
> sind bibs die wiederum wiringPi braucht ( so wie ich es verstanden habe)
Sozusagen. "installiert" meint hier: "die Headerfiles und Library-Files
sind in einem der Standardverzeichnisse für Compiler/Linker gelandet"
Alternativ kann man die Library einfach "irgendwo" hinkippen und die -I
und -L Optionen passend setzen. Eine IDE versteckt das in einem Dialog
für Projekteinstellungen. Irgendwo unter "Compiler" und "Linker" und
dann "Suchpfade".
> In meiner IDE ( Clion) kennt die wiringPi bib allerdings nicht, ist
> schließlich nicht auf meinem Dev-Computer. Aber wie bringe ich dieser
> jetzt bei, dass es dort eine bib gibt? Sodass ich die ganzen
> "Annehmlichkeiten" die mit Verwendung einer IDE kommen benutzen kann
> (Autofill etc.) ?
Am besten: gar nicht.
Das läuft nämlich darauf hinaus, daß du dein Programm crosscompilierst.
Schließlich wirst du ja auch direkt aus der IDE compilieren wollen und
dann von einer Fehlermeldung des Compilers direkt in den Code springen
wollen, oder?
Crosscompilieren ist aufwendig einzurichten. Das macht man nur, wenn es
auf der Zielplattform nicht geht. Wie bei einem AVR zum Beispiel. Der Pi
hingegen ist ein vollständiges Linux-System. Da läuft nicht nur ein
Compiler drauf, sondern auch eine IDE.
Die zweit Hürde handelst du dir mit Windows ein. Wenn dein
Entwicklungsrechner unter Linux laufen würde, dann hättest du gute
Chancen, den Crosscompiler und die (Cross-)Libraries für den Pi einfach
aus dem Paketmanager installieren zu können. Aber für Windows bist du
darauf angewiesen, das entweder selber zu machen oder jemanden zu
finden, der es bereits gemacht hat.