Hallo, seit mehreren Stunden versuche ich jetzt nachzuvollziehen, wie ich meine eigene library schreiben kann. Was ich bis jetzt verstanden habe: -ich brauche eine Headerdatei mit den Deklarationen aller Funktionen -in eine separate C-Datei schreibe ich dann das eigentliche Programm -ich binde die Headerdatei in die C-Datei ein Nur leider scheitert es bei der Umsetzung. Wie gehe ich vor? Ich habe schon so viel ausprobiert, es wäre nett, wenn jemand das einmal in einfachen Schritten aufzählen könnte. Muss ich etwa unter "new project" ein "static library project" erstellen? Oder einfach eine Datei mit Endung ".h" und eine mit ".c"? Außerdem: Der Sinn des Linkers ist es ja, kompilierten Code... nun ja... zu linken. Dazu müsste der Code ja Gerätespezifisch sein; irgendwo müsste ich also den Mikrocontroller auswählen?
Hi Der µC wird ja nicht in Deinem Code ausgewählt - der Compiler wird meckern, wenn Dein Code nicht zu dem µC passt ;) Wie sieht eine Einfachst-Library unter C aus? 'Kenne' bis jetzt nur ein/zwei vom Arduino - und Deren Inhalt unterscheidet sich doch schon von dem normalem Programm. Allerdings durchaus sinnig aufgebaut, also zum Teil ;) Woher hast Du Deine Informationen, was konntest Du daraus entwickeln und wo scheiterst Du? MfG
Ich habe die Informationen u.a. von hier: https://www.mikrocontroller.net/articles/Funktionen_auslagern_(C) Außerdem habe ich immer auf Youtube die Serie "Arduino for production" von Patrick-Hood-Daniel verfolgt, die sich trotz des irreführenden Namens mit der C-Programmierung von AVRs beschäftigt. Er hat in einem Video eine Header datei erstellt, aber sämtlichen Code einfach in diese hieingeschrieben, was ja nicht Sinn der Sache ist. Ich habe jetzt mal einfach eine .h Datei und eine .c Datei erstellt und beide über den Solution Explorer manuell eingebunden. Das hat sogar geklappt! Dann verstehe ich nur nicht, wieso ich bei "new project" die Option "build static library" habe, denn wenn ich das mache, darin eine header-Datei erstelle und die library als solche über den Solution Explorer einbinde, bekomme ich eine Fehlermeldung.
Wo muss z.B. die C-Datei, also die eigentliche library, gespeichert werden? Als ich die Header-Datei und besagte C-Datei in dem gleichen Ordner wie main.c speicherte und den header über #include "[name des headers" einband, wurde der header nicht gefunden. Und dann lese ich hier https://www.mikrocontroller.net/articles/Libraries#Fertige_Library etwas von einer .a Endung, die (laut Artikel) kompilierte Form der library. Wie passt das dazu, dass ich doch eigtl. eine Header-Datei und eine Datei mit C-Sourcecode brauche?
Angenommen man will eine statische Library (.a) erstellen, dann muss man sich bewusst sein, dass das einfach nur ein Archiv von .o dateien ist. Das Interface zur Library stellen dann die .h dateien der Library dar, die Implementation die .c Dateien. Angenommen meine Library stellt die funktion getRandomNumber bereit, dann könnte diese so aufgebaut werden: mylibrary/src/header/mylibrary.h
1 | int getRandomNumber(void); |
mylibrary/src/mylibrary.c
1 | int getRandomNumber(void){ |
2 | return 4; // chosen by fair dice roll. |
3 | // guaranteed to be random.
|
4 | }
|
Compilieren und library erstellen:
1 | gcc src/mylibrary.c -c -o tmp/mylibrary.o |
2 | ar cr bin/libmylibrary.a tmp/mylibrary.o |
Jetzt haben wir eine statische Library mylibrary/bin/libmylibrary.a und das interface dazu in mylibrary/src/header/mylibrary.h. Nun könnte man das in einem Projekt wiefolgt verwenden: myproject/src/main.c:
1 | #include <mylibrary.h> |
2 | |
3 | int main(){ |
4 | return getRandomNumber(); |
5 | }
|
Und compilieren:
1 | gcc -L../mylibrary/bin/ -I../mylibrary/include/ -lmylibrary src/main.c -o bin/myproject |
Das -L ist das Verzeichnis wo die library gesucht werden soll, -l zum dazulinken der Library, und mit -I wird dem Kompiler mitgeteilt, wo die Headerfiles der Library zu suchen sind. Die Commandos fürs Kompilieren kann man dann in ein Makefile packen, man kann aber auch cmake, automake, etc. verwenden. Danach muss man am schluss jeweils nurnoch "make" eintippen. Deine IDE wird vermutlich auch Optionen haben, um anzugeben welche Dateien zu kompilieren sind, wo die Header liegen, etc. Das ist dann aber IDE spezifisch und in anderen Umgebungen ohne diese nutzlos. In IDEs kann man jedoch meistens auch ein Makefile auswählen. Weil makefiles (ich meine hier auch Dinge wie cmake oder automake) unabhängig von Entwicklungsplatform und IDE nutzbar sind, findet man bei OpenSource Projekten, wie man sie auf z.B. GitHub sieht, normalerweise nur die Makefiles, aber keine Projektdateien irgendwelcher IDEs. Ich empfehle deshalb sehr, Makefiles zu verwenden. PS: Der code ist ungetestet und wurde auf einem Ipad 2 um 4 uhr morgens eingetippt...
Daniel A. schrieb: >
1 | > int getRandomNumber(void){ |
2 | > return 4; // chosen by fair dice roll. |
3 | > // guaranteed to be random. |
4 | > } |
5 | >
|
da fehlt aber auch noch der Quellennachweis :o)
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.