Hi!
Ich habe folgendes Problem: Ich wuerde gern mit gcc / egcc eine C-Datei uebersetzen, die eine Header-Datei importiert. Die Header-Datei ist im gleichen Verzeichnis und lesbar (im Bezug auf die Rechte des Users).
Ich rufe egcc so auf: egcc test1.c
Die Include-Anweisung: #include "SDL.h"
Die Fehlermeldung: /tmp/ccUjSHc2.o: In function `main': /tmp/ccUjSHc2.o(.text+0x9): undefined reference to `SDL_Init' /tmp/ccUjSHc2.o(.text+0x17): undefined reference to `SDL_GetError' /tmp/ccUjSHc2.o(.text+0x26): undefined reference to `fprint' /tmp/ccUjSHc2.o(.text+0x38): undefined reference to `SDL_Quit' /tmp/ccUjSHc2.o(.text+0x53): undefined reference to `SDL_SetVideoMode' /tmp/ccUjSHc2.o(.text+0x66): undefined reference to `SDL_GetError' /tmp/ccUjSHc2.o(.text+0x8b): undefined reference to `SDL_EventState' /tmp/ccUjSHc2.o(.text+0x97): undefined reference to `SDL_WaitEvent' collect2: ld returned 1 exit status
Wie unschwer zu erkennen ist, habe ich versucht, das SDL-Beispiel aus dem aktuellen Linux-Magazin nachzuvollziehen. Allerdings sind meine Kenntnisse im Umgang mit den C-Compilern sehr gering.
Kann mir jemand ein geeignetes Buch empfehlen, das C und C++ - Programmierung erklärt und vielleicht noch etwas zu den Linux-C-Compilern erzählt?
MfG, Tobias
Tobias Kluge - TKluge@edvconsult.de - http://edvconsult.de/tkluge/
********************************************************** *Wer nicht hofft, der wird dem Unverhofften nie begegnen!* **********************************************************
On Sat, 12 Feb 2000, Tobias Kluge wrote:
Ich habe folgendes Problem: Ich wuerde gern mit gcc / egcc eine C-Datei uebersetzen, die eine Header-Datei importiert. Die Header-Datei ist im gleichen Verzeichnis und lesbar (im Bezug auf die Rechte des Users).
Ich rufe egcc so auf: egcc test1.c
Die Include-Anweisung: #include "SDL.h"
Die Fehlermeldung: /tmp/ccUjSHc2.o: In function `main': /tmp/ccUjSHc2.o(.text+0x9): undefined reference to `SDL_Init' /tmp/ccUjSHc2.o(.text+0x17): undefined reference to `SDL_GetError' /tmp/ccUjSHc2.o(.text+0x26): undefined reference to `fprint' /tmp/ccUjSHc2.o(.text+0x38): undefined reference to `SDL_Quit' /tmp/ccUjSHc2.o(.text+0x53): undefined reference to `SDL_SetVideoMode' /tmp/ccUjSHc2.o(.text+0x66): undefined reference to `SDL_GetError' /tmp/ccUjSHc2.o(.text+0x8b): undefined reference to `SDL_EventState' /tmp/ccUjSHc2.o(.text+0x97): undefined reference to `SDL_WaitEvent' collect2: ld returned 1 exit status
Wie unschwer zu erkennen ist, habe ich versucht, das SDL-Beispiel aus dem aktuellen Linux-Magazin nachzuvollziehen. Allerdings sind meine Kenntnisse im Umgang mit den C-Compilern sehr gering.
Kann mir jemand ein geeignetes Buch empfehlen, das C und C++ - Programmierung erklärt und vielleicht noch etwas zu den Linux-C-Compilern erzählt?
Der Fehler liegt nicht im Header. Wie man oben erkennen kann kommt der Fehler vom ld (Linker), Deine Kommandozeile haette so aussehen muessen:
gcc test1.c -lSDL
-lSDL bedeutet "Linke eine Datei namens libSDL.a oder libSDL.so hinzu", dort sind die viermissten Anweisungen zu finden. Achtung: eventuell muessen noch einige andere Bibos gelinkt werden.
Uebrigens solltest Du auch fprinf statt fprint benutzen, irgendwo haette da die Warnung "implicit declaration of int fprint(...)" vorher kommen muessen. Wegen sowas sollte man auch das Flag -Wall anschalten - damit bekommt man alle Warnungen des Compilers aufgetischt - ist manchmal recht hilfreich, andererseits oft auch verwirrend.
Literatur: *im selben Linux-Mag steht ein Artikel mit Compilern und Linkern fuer Anfaenger (S. 128) *Krueger: "Programmieren in C" - recht guter Einstieg in ANSI C *Stevens: "Programmierung in der Unix Umgebung" - sehr gute Einfuehrung (und Vertiefung) zur Unix/Linux Programmierung - incl. Linker, Bibos usw. *allgemein: die Buecher von den Verlagen Addison-Wesley und O'Reilly sind durchweg als gut zu empfehlen. Du solltest allerdings vorher einen Blick hineinwerfen, ob es Dein Level ist. Deutsche Verlage, wie MArkt&Technik oder gar Springer kann man voll vergessen - die haben die ganzen schwafelnden Autoren, die viel reden aber nix sagen.
Konrad
On Sat, Feb 12, 2000 at 10:56:27AM +0100, Tobias Kluge wrote:
Ich rufe egcc so auf: egcc test1.c
Die Include-Anweisung: #include "SDL.h"
Die Fehlermeldung: /tmp/ccUjSHc2.o: In function `main': /tmp/ccUjSHc2.o(.text+0x9): undefined reference to `SDL_Init' /tmp/ccUjSHc2.o(.text+0x17): undefined reference to `SDL_GetError' /tmp/ccUjSHc2.o(.text+0x26): undefined reference to `fprint' /tmp/ccUjSHc2.o(.text+0x38): undefined reference to `SDL_Quit' /tmp/ccUjSHc2.o(.text+0x53): undefined reference to `SDL_SetVideoMode' /tmp/ccUjSHc2.o(.text+0x66): undefined reference to `SDL_GetError' /tmp/ccUjSHc2.o(.text+0x8b): undefined reference to `SDL_EventState' /tmp/ccUjSHc2.o(.text+0x97): undefined reference to `SDL_WaitEvent' collect2: ld returned 1 exit status
Das Compilieren hat geklappt, nur das Linken nicht. Du verwendest in deiner test1.c die SDLxxxx-Funktionen. Beim Compilieren der test1.c ist nur wichtig, dass die Funktionen irgendwo definiert sind. Das sind sie - in der SDL.h naehmlich. Diesen Schritt kannst du erstmal mit "gcc -c -o test1.o test1.c" abschliessen. test1.o ist dann das, was in deinem Beispiel /tmp/ccUjSHc2.o ist. So wie du den Compiler aufgerufen hast, also ohne -c, wird am Ende gleich noch der Linker angeworfen um aus dem Object-file und ggf. einigen Bibliotheken das fertige Programm zu bauen. Der Linker (ld) muss nun zu allen in test1.o definierten Funktionen auch den eigentlichen Code finden. Die Funktion SDL_Quit ist zwar in SDL.h definiert, die Implementation der Funktion steht aber woanders drin - entweder in einer Bilbliothek oder einem anderen Objectfile. Das musst du mit hinzulinken. z.B. so falls es einen shared library ist (libSDL.so.xxx) gcc test1.o -lSDL -o test1 oder gcc test1.o libSDL.a -o test1 oder gcc test1.o SDL.o -o test1
Wie unschwer zu erkennen ist, habe ich versucht, das SDL-Beispiel aus dem aktuellen Linux-Magazin nachzuvollziehen. Allerdings sind meine Kenntnisse im Umgang mit den C-Compilern sehr gering.
Um das ganze zu kapieren wuerde ich mir an deiner Stelle ein fertiges kleines Programmpaket suchen und versuchen zu verstehen, was beim Aufruf von 'make' gemacht wird.
Kann mir jemand ein geeignetes Buch empfehlen, das C und C++ - Programmierung erklärt und vielleicht noch etwas zu den Linux-C-Compilern erzählt?
Sehr zu empfehlendes Standardwerk zu C ist das Buch von Kernighan/Ritchie (2.Auflage, deutsche Version vom Hanser-Verlag, Titel ist wohl "Programmieren in C") Bin mir nicht ganz sicher, da ich das Buch gerade verliehen habe. Zu C++ kenne ich nur den Stroustrup-Waelzer naeher ueber den die Meinungen weit auseinandergehen. Fuer Anfaenger ist es definitiv ungeeiggnet.
Solche Buecher behandeln nur die Programmiersprachen an sich, nicht den Umgang mit einem Compiler. Such dir dafuer mal jemanden, der davon Ahnung hat und es dir erklaeren kann. Buecker fuer sowas halte ich nicht fuer sinnvoll, da die dann total compiler- und plattformspezifisch sind. Vor allem wenn da gross "Linux" draufsteht waere ich skeptisch.
Reinhard
Halllo,
haette ich es doch fast vergessen: Wer kann mir als Nich-LM-(Abonenten|Kaeufer) sagen, was SDL ist?
Reinhard
Hi!
haette ich es doch fast vergessen: Wer kann mir als Nich-LM-(Abonenten|Kaeufer) sagen, was SDL ist?
SDL - Simple DirectMedia Layer Damit kann man alles in Richtung MultiMedia (Sound, Grafik, ...) programmieren, so ne Art DirectX fuer Linux. Die Programme sind (angeblich) auch auf Win portierbar. Also sehr interessant (po mojemu)!
MfG, Tobias
lug-dd@mailman.schlittermann.de