Not logged in. · Lost password · Register

Yves
Code artist
(Administrator)
Avatar
Member since Nov 2002
3282 posts
Subject: Linken mehrerer C-Dateien?
Ich hab jetzt versucht, die port_formard-Aufgabe so zu lösen, wie es gefordert ist, und 2 C-Dateien. Da mir nix besseres eingefallen ist, hab ich das Beispiel-Makefile aus D-Uebung2-A5.gz.ps (siehe SysProg-Webseite), Seite D.10, genommen und meine Dateien pfwd.c und forward.c eingetragen. Naja, nur funzt des irgendwie net. Ich bekomm tausende Fehler, dass irgendwas net gefunden wird:

Folgende Dateien erzwingen neu-linken von pfwd: pfwd.o forward.o
ld  -o pfwd pfwd.o forward.o
ld: warning: cannot find entry symbol _start; defaulting to 08048080
pfwd.o: In function `main':
pfwd.o(.text+0x32): undefined reference to `atoi'
pfwd.o(.text+0x4c): undefined reference to `socket'
pfwd.o(.text+0x67): undefined reference to `perror'
pfwd.o(.text+0x81): undefined reference to `htonl'
(...)
pfwd.o(.text+0x2dd): undefined reference to `close'
pfwd.o(.text+0x2f8): undefined reference to `close'
pfwd.o: In function `chld_handler':
pfwd.o(.text+0x31a): undefined reference to `waitpid'
forward.o: In function `forward':
forward.o(.text+0x2d): undefined reference to `recv'
forward.o(.text+0x40): undefined reference to `__errno_location'
forward.o(.text+0x56): undefined reference to `perror'
forward.o(.text+0x7f): undefined reference to `send'
forward.o(.text+0x9c): undefined reference to `recv'
forward.o(.text+0xaf): undefined reference to `__errno_location'
forward.o(.text+0xc5): undefined reference to `perror'
forward.o(.text+0xeb): undefined reference to `send'
make: *** [pfwd] Error 1

In Windows C++ würde ich jetzt sagen, da fehlen gewaltig Bibliotheken, die mit gelinkt werden müssen. Die ld-Manpage sagt aber, dass die Standard-Pfade bereits durchsucht werden.

Was soll ich also machen? Ich krieg mein Programm so nicht kompiliert. :(
Physikalisch gesehen ist ein Quantensprung die kleinstmögliche Zustandsänderung, meist von einem höheren auf ein niedrigeres Niveau.

Komprenu Energiemonitoring-Software | dotforward Webhosting
frahi
Avatar
Member since Nov 2002
777 posts
du kannst auch den gcc zum linken benutzen, der wenn object files kriegt, linkt er die auch gleich richtig

ich wusst gar net, dass es auch ein Compiler/Linker namens "Windows" gibt
This post was edited on 2004-01-04, 10:50 by frahi.
Yves
Code artist
(Administrator)
Avatar
Member since Nov 2002
3282 posts
Quote by frahi:
du kannst auch den gcc zum linken benutzen, der wenn object files kriegt, linkt er die auch gleich richtig
vielen dank, funktioniert so. nur wozu braucht man dann den ld?

ich wusst gar net, dass es auch ein Compiler/Linker namens "Windows" gibt
meinte microsoft visual c++
Physikalisch gesehen ist ein Quantensprung die kleinstmögliche Zustandsänderung, meist von einem höheren auf ein niedrigeres Niveau.

Komprenu Energiemonitoring-Software | dotforward Webhosting
Ford Prefect
Pangalaktischer- Donnergurgler-Trinker
(Administrator)
Avatar
Member since Oct 2002
3298 posts
wer den ld braucht, wird schon wissen, wieso er ihn braucht... [tm]
Quote: <mute> mit Miranda macht irc kein spass :P <Loki|muh> dann geh doch wieder :)
<mute> ich benutze kein miranda <Loki|muh> na und? :)
Yves
Code artist
(Administrator)
Avatar
Member since Nov 2002
3282 posts
Dann sollte ich mal den fragen, der das in unser Übungsskript reingetan hat...
Physikalisch gesehen ist ein Quantensprung die kleinstmögliche Zustandsänderung, meist von einem höheren auf ein niedrigeres Niveau.

Komprenu Energiemonitoring-Software | dotforward Webhosting
Fuchsi
"Ehergeher"
Avatar
Member since Oct 2002
348 posts
Quote by Yves:
Dann sollte ich mal den fragen, der das in unser Übungsskript reingetan hat...

Also dann wohl der hier:
juk
Schaut mal alle her, wie lang mein Server schon wieder läuft! :-D Weiter...
Du bist so gemein, Yves! :motz:
juk
Member since Dec 2003
383 posts
Quote by Fuchsi:
Quote by Yves:
Dann sollte ich mal den fragen, der das in unser Übungsskript reingetan hat...

Also dann wohl der hier:
juk

Aehh, ich weiss auch nicht wie das in das Skript reingeraten ist -
das steht da schon immer so drin :-)

Aber im Ernst - das ist wirklich nicht ganz korrekt so wie's auf
Seite D.3 im Uebungsskript steht.

cc (bzw. gcc) ist letztlich ein Programm, das zuerst den C-Praeprozessor
(/usr/bin/cpp) aufruft, die Ausgabe dann compiliert
(bzw. wenn man ihm ein Fortran-File gibt ruft
er z.B. sogar den Fortran77-Compiler auf)
und am Ende fuer die ganzen .o-Files die
dabei entstehen den /usr/bin/ld aufruft.

Wenn man dem gcc gleich .o-Files uebergibt, laesst er natuerlich
die ganzen Schritte vorher dafuer weg.

Beim ld-Aufruf gibt der gcc immer noch die Option -lc
mit - d.h. es wird die Datei /usr/lib/libc.a mit eingebunden.

Und das ist genau der Unterschied zwischen einem einfachen
gcc-Aufruf mit .o-Files und eine ld-Aufruf.
Wuerde man also in dem Beispiel auf Seite D3
ld -o test test.o func.o -lc
schreiben, dann wuerde das auch funktionieren.
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Go to forum
Datenschutz | Kontakt
Powered by the Unclassified NewsBoard software, 20150713-dev, © 2003-2011 by Yves Goergen