Linken mehrerer C-Dateien?

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

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:

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. :frowning:


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


vielen dank, funktioniert so. nur wozu braucht man dann den ld?

meinte microsoft visual c++


wer den ld braucht, wird schon wissen, wieso er ihn braucht… [tm]


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 :slight_smile:

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.