Red Hat 8.0 und gcc - Probleme beim Einbinden timer.h
-
Red Hat 8.0 - Programmierung
Hallo, ich hoffe mir kann jemand sagen, was ich falsch mache.
Ich bin erst vor kurzen auf Linux umgestiegen und versuche aus einem Buch (Linux Programmierung Richard Stones / Neil Matthew)
einige Beispiele nachzuvollziehen. Als Entwicklungsumgebung verwende ich die eclipse, weiterführend den gcc-Compiler und bin als
normaler user ohne root-Rechte angemeldet.#include <linux/timer.h> in einem simplen Hallo_World-Projekt
führt zu haufenweisen Fehlermeldungen, mit der Define-Anweisung __KERNEL__ wurden es einige weniger.
In <linux/timer.h> werden allerdings weitere header benötigt, u.a. auch <linux/spinlock.h>. Den gibt es zwar (in usr/include/linux), aber bis auf #define __LINUX_SPINLOCK_H steht da nichts drin. Darauf hin war natürlich in timer.h der benutzte Datentyp spinlock_t nicht definiert.
Einen umfangreicheren und neueren header spinlock.h habe ich im Verzeichnis usr/src/~linux-2.4/include/linux gefunden, habe ihn in mein Projektverzeichnis kopiert und ihn von dort eingebunden. Damit war zwar spinlock_t als Typ vorhanden, es traten aber neue Fehler auf, z.B. wurde der benötigte header stringify.h im Pfad (usr/include/linux) gar nicht gefunden, im usr/src/~linux-2.4/include/linux gibt es ihn aber.
Habe auch diesen Header in's Projektverzeichnis kopiert, dann konnte ich wenigstens ohne Fehler ein build machen.
Das dürfte aber nicht der gängige Weg sein. Ich verstehe nicht, wieso ich nicht alle (zumal neueren) Header vom Pfad usr/src/~linux-2.4/include
im Pfad usr/include wiederfinde, da ja gcc diesen offenbar auch als Standardpfad für seine include-Anweisung verwendet.
Ein Hinweis auf unsauberes Einbinden der Header dürfte wohl auch die Warnung "Using kernel header in userland!" sein. Diese kommt z.B. bei dem Versuch, den Header fs.h mit einzubinden (#include <linux/fs.f>)
-
Du solltest die Warnung beherzigen und dich von den Kernel-Headers fernhalten. Was spricht gegen <sys/time.h>?
Oder du installierst halt genau die Version der Kernel-Headers, die im Buch verwendet wird.
-
Danke für deine Antwort.
Mein Fernziel ist es ein Programm zu schreiben, welches sich selbst aller 100 msec weckt, dann eine CAN-Karte mittels CANopen-Treiber auf Daten
abfragt, diese aufbereiteten Daten über shared memory ?? anderen Prozessen zur Verfügung stellt und wieder schlafen geht.
Für die Zeitsteuerung im ms-Bereich benötige ich lt. dem entsprechenden Kapitel im Buch Zeitgeber und den entspr. Header timer.h. An alles weitere wollte ich mich Schritt für Schritt rantasten.
Ein pures Einbinden von <linux/timer.h> sollte doch meiner Meinung nach erst mal ohne Fehlermeldungen möglich sein. Ich denke, dass ich da noch ein generelles Linuxversions- oder Verständnisproblem habe (warum existieren verschiedene Varianten der Header [z.B. spinlock.h] auf meinem Rechner?).
Eine Linux-Version zum Buch gibt es nicht, ich habe es aber auch nicht komplett von vorn durchgearbeitet sondern nur das für mein Problem relevante Kapitel rausgesucht und versuche die entpr. Beispielprogramme nachzuvollziehen und zu verstehen.
-
Nimm setitimer und halte dich von dem Rest fern.
Die Kernel Header sind eine Plage, weil sie sich ständig ändern, und sollten nicht verwendet werden, wenn nicht unbedingt nötig.
-
Danke für den Tip,
das Einbinden von SDL_timer.h ging erst mal ohne Fehlermeldungen und ohne __KERNEL__-define über die Bühne. Werde erst mal damit rumspielen.
-
Beim Aufruf eine Funktion aus SDL_timer.h in main() z.B.
ui_test = SDL_GetTicks();
kommt Fehlermeldung
"undefined reference to "SDL_GetTicks".
Welche Bibliothek muß ich noch zusätzlich dem gcc bekanntgeben, bzw. wer stellt mir diese Funktionen in SDL_timer.h zur Verfügung ?
-
Habe es selbst gefunden.
Spiele weiter.