Servus ihr C-Freaks,
Meine Erfahrung bei C ist relativ überschaubar: Ich kann vorhandenen Code einigermaßen lesen/verstehen und auch selber einen 20-Zeiler (oder so) aufziehen. Allerdings stöße ich an meine Grenzen bei #include, vor allem, wenn dann ein Modul nicht gefunden werden kann. Richtig undurchsichtig wird's für mich, wenn fette Makefiles dabei sind, in denen man auf den ersten Blick nicht einmal die gcc-Aufrufe findet. So z.B. wenn man die GNU-Bibliothek libcdio installieren will und dann das erste Beispiel von der GNU-Seite versucht zu kompilieren. Das schlägt natürlich fehl!
Installation von libcdio auf dem RPi
Die Installation habe ich weitestgehend nach der Installationsanleitung (README-Dateien) vermutlich erfolgreich(?) vorgenommen
Am RPi unter Raspbian Stretch PIXEL:
* autoconf: 1358kB Archive, 4185kB Plattenplatz entpackt
* libtool: 704kB Archive, 2177kB Plattenplatz entpackt
* texinfo: 4199kB Archive, 17,1MB Plattenplatz entpackt
* help2man: 162kB Archive, 465kB Plattenplatz entpackt
--> die nicht aufgeführten Pakete sind bereits im aktuellen Raspbian enthalten...
$ git clone git://git.savannah.gnu.org/libcdio.git # Herunterladen des aktuellen Projektes
$ cd libcdio
$ sh ./autogen.sh # erstellt "automatisch" das Script configure.ac und führt es aus
$ make # or remake # --> dauert auf dem RPi2 ca. 5-6 Minuten
$ make check # or remake check # Überprüfungen
Es sollte eine Ausgabe ohne Fehler erscheinen, war bei mir auch der Fall.
Bei den make-Aufrufen werden u.a. die Beispielcodes in ./libcdio/src und ./libcdio/example erfolgreich kompiliert.
Wenn ich aber eines der Programme mit gcc eject.c -o eject kompilieren will, erhalte ich vom Compiler bloß folgende Fehlermeldungen:
eject.c: In function 'main':
eject.c:50:17: warning: implicit declaration of function 'strdup' [-Wimplicit-function-declaration]
psz_drive = strdup(argv[1]);
^
eject.c:50:17: warning: incompatible implicit declaration of built-in function 'strdup'
eject.c:55:7: warning: implicit declaration of function 'printf' [-Wimplicit-function-declaration]
printf("Can't find a CD-ROM to eject\n");
^
eject.c:55:7: warning: incompatible implicit declaration of built-in function 'printf'
eject.c:55:7: note: include '<stdio.h>' or provide a declaration of 'printf'
eject.c:56:7: warning: implicit declaration of function 'exit' [-Wimplicit-function-declaration]
exit(1);
^
eject.c:56:7: warning: incompatible implicit declaration of built-in function 'exit'
eject.c:56:7: note: include '<stdlib.h>' or provide a declaration of 'exit'
eject.c:62:5: warning: incompatible implicit declaration of built-in function 'printf'
printf("Eject not supported for %s.\n", psz_drive);
^
eject.c:62:5: note: include '<stdio.h>' or provide a declaration of 'printf'
eject.c:73:5: warning: incompatible implicit declaration of built-in function 'printf'
printf("Closed tray of CD-ROM drive %s.\n", psz_drive);
^
eject.c:73:5: note: include '<stdio.h>' or provide a declaration of 'printf'
eject.c:75:5: warning: incompatible implicit declaration of built-in function 'printf'
printf("Closing tray of CD-ROM drive %s failed.\n", psz_drive);
^
eject.c:75:5: note: include '<stdio.h>' or provide a declaration of 'printf'
eject.c:77:3: warning: implicit declaration of function 'free' [-Wimplicit-function-declaration]
free(psz_drive);
^
eject.c:77:3: warning: incompatible implicit declaration of built-in function 'free'
eject.c:77:3: note: include '<stdlib.h>' or provide a declaration of 'free'
eject.c:82:5: warning: incompatible implicit declaration of built-in function 'printf'
printf("Eject not supported for default device.\n");
^
eject.c:82:5: note: include '<stdio.h>' or provide a declaration of 'printf'
eject.c:94:5: warning: incompatible implicit declaration of built-in function 'printf'
printf("Closed tray of CD-ROM drive for default disc driver:\n\t%s\n",
^
eject.c:94:5: note: include '<stdio.h>' or provide a declaration of 'printf'
eject.c:97:5: warning: incompatible implicit declaration of built-in function 'printf'
printf("Closing tray of CD-ROM drive failed for default "
^
eject.c:97:5: note: include '<stdio.h>' or provide a declaration of 'printf'
/tmp/ccURhsBj.o: In Funktion `main':
eject.c:(.text+0x59): Nicht definierter Verweis auf `cdio_get_default_device_driver'
eject.c:(.text+0x84): Nicht definierter Verweis auf `cdio_eject_media_drive'
eject.c:(.text+0xef): Nicht definierter Verweis auf `cdio_close_tray'
eject.c:(.text+0x137): Nicht definierter Verweis auf `cdio_eject_media_drive'
eject.c:(.text+0x183): Nicht definierter Verweis auf `cdio_close_tray'
eject.c:(.text+0x191): Nicht definierter Verweis auf `cdio_driver_describe'
eject.c:(.text+0x1af): Nicht definierter Verweis auf `cdio_driver_describe'
collect2: error: ld returned 1 exit status
Alles anzeigen
Im Makefile finde ich zwar die Definitionen
CC = gcc
CFLAGS = -g -O2 -Wall -Wbad-function-cast -Wcast-align -Wchar-subscripts -Wdeclaration-after-statement -Wdisabled-optimization # und noch etliche andere -W...-Optionen
Aber auch ein gcc eject.c -o eject -g -O2 führt nicht zum Erfolg.
Meine Frage:
Wie kompiliert man diese Programme standalone? Kann ja kein Hexenwerk sein...
Die bestehenden Programme kann man ja mit make neu erstellen. Aber wie erstelle ich neue Programme unter Nutzung dieser Bibliothek?
Hat da jemand mehr Erfahrung als ich und kann mir da mal Ratschläge geben, wie man so große C-Projekte (vor allem fremde) richtig versteht und anpackt?
schlizbäda
PS:
Die Datei Makefile.txt heißt bei mir nur Makefile, aber unter diesem Namen darf ich sie im Forum nicht hochladen