Allgemeine Frage zum "Linker" und Libs

Widlarizer

Captain Special
Mitglied seit
01.02.2007
Beiträge
211
Renomée
0
Standort
Essen
Hi Leute,

ich hätte mal eine grundlegende Frage zu Libraries und dem Linker, vorzugsweise bei Anwendung von C++.

Also, wenn ich meine .cpp Datei soweit fertig habe, rufe ich den Compiler auf. Vorher verrichtet der Präprozessor noch sein Werk und arbeitet alle #include und #define Anweisungen ab. Header Files werden demnach in die .cpp Datei eingebunden und sind nach dem Kompilieren daher auch nicht als eigenständigen .obj oder .o File vorhanden, richtig?

Gut, jetzt hat der Compiler also seine Arbeit getan und eine oder mehrere Objektdatei(en) erzeugt. Als nächstes tritt dann ja der Linker auf den Plan und verlinkt die Objektdateien miteinander, richtig?

Wie verhält es sich dann mit Libraries, diese liegen ja nicht als Objektdatei vor, sondern sind z.B. ja "nur" als .dll Datei vorhanden? Sehe ich das also richtig, dass der Linker nicht ausschließlich mit Objektdateien arbeiten kann, sondern auch noch mit anderen Dateiformaten?

Auf Windows Systemen wird letztendlich eine .exe Datei erzeugt, wie schauts aber auf Unix Systemen aus? Kann mir jemand sagen wie da die Dateiendung eines ausführbaren Programms lautet?

Danke für eure Hilfe!
 
[...] wie schauts aber auf Unix Systemen aus? Kann mir jemand sagen wie da die Dateiendung eines ausführbaren Programms lautet?
Es gibt auf Linux und Unix keine Dateiendungen, die etwas über die Ausführbarkeit einer Datei sagen. Anders formuliert: ausführbare Programme haben normalerweise keine Extension sondern werden durch das Executable Bit erst ausführbar. Bei Skripten (Bash, Perl, Python oder sonstwas) läuft das übrigens genauso. Extensions können vorhanden sein, müssen aber nicht.

Um aber mal konkreter auf deine Fragestellung zu antworten: auf Linux werden (normalerweise) sogenannte ELF-Binaries (in der englischen Wikipedia ausführlicher) erzeugt.

MfG Dalai
 
Ah ok, vielen Dank für die Info!
Werde mir den Wikipedia Link heute im Laufe des Tages mal in Ruhe durchlesen.

Momentan schlage ich mich unter Unix mit ClearCase UND Linker Probleme beim Komiliervorgang herum, daher dachte ich mir, dass es ja nicht schaden könnte die Grundlagen etwas genauer zu beleuchten.
 
Wie verhält es sich dann mit Libraries, diese liegen ja nicht als Objektdatei vor, sondern sind z.B. ja "nur" als .dll Datei vorhanden? Sehe ich das also richtig, dass der Linker nicht ausschließlich mit Objektdateien arbeiten kann, sondern auch noch mit anderen Dateiformaten?
Zu diesen externen Libraries braucht der Linker normalerweise neben einem Header auch eine .lib. Die externen Libraries werden nicht in das Programm reinkompiliert bzw. -gelinkt, sondern es wird Code generiert (bzw. müsste der in der .lib stehen), mit dem die DLL beim Start des Programms geladen wird und die Verweise in die DLLs aufgelöst werden (das übernimmt der Program Loader des Betriebssystems).
Hat man keine .lib zur .dll, kann man die Funktionen der dll zumindest unter Windows auch dynamisch einbinden. Dafür stellt Windows die API-Funktionen LoadLibrary und GetProcAddress zur Verfügung. Die dll wird dann nicht beim Programmstart geladen, sondern erst beim Aufruf von LoadLibrary. Ebenso wird jeder Verweis einzeln erst beim Aufruf von GetProcAddress aufgelöst.
 
Gut, jetzt hat der Compiler also seine Arbeit getan und eine oder mehrere Objektdatei(en) erzeugt. Als nächstes tritt dann ja der Linker auf den Plan und verlinkt die Objektdateien miteinander, richtig?

Wie verhält es sich dann mit Libraries, diese liegen ja nicht als Objektdatei vor, sondern sind z.B. ja "nur" als .dll Datei vorhanden? Sehe ich das also richtig, dass der Linker nicht ausschließlich mit Objektdateien arbeiten kann, sondern auch noch mit anderen Dateiformaten?
Allgemein, es gibt zwei verschieden Arten von Bibliotheken? Du sprichst hier von dynamisch gelinkten, was die Endung dll schon sagt. Die steht für dynamic linked library. Daneben gibt es auch statisch gelinkte Bibliotheken. Letztere sind an sich nichts anderes als ein Archiv von Objekt-Dateien. Die dlls sind später entwickelt worden und haben ein paar Sonderheiten, die die dynamische Auflösung von Symbolen betrifft.
Statische sowie dynamische Libs und auch Executables sind eigentlich alles nur bestimmte Objektdateien.
 
Zurück
Oben Unten