2012-08-24 2 views
6

Das Problem

Informationen darüber, wie Verknüpfung im Detail funktioniert, sind knapp. Auch IDEs verstecken die Details der Kompilierung, was ein echtes Problem ist, wenn Sie ein Problem mit der Verknüpfung Ihres Projekts haben.Was jeder C++ Entwickler über das Verknüpfen wissen sollte

Normalerweise C++ Bücher sagen mir, dass

C++ code --> preprocessed c++ code --> object code 

Aber sie wirklich gehen nicht zu sehr ins Detail auf, was ein durchschnittlicher Entwickler über die Verknüpfung trotz der Tatsache wissen sollte, dass die Verknüpfung Fehler gemeinsam sind. Wie sollte ein neuer C++ - Programmierer wissen, wie man einen Fehler wie den folgenden anpackt?

XmlRpcSocket.o:XmlRpcSocket.cpp:(.text+0x48b): undefined reference to `[email protected]' 

Aber diese Frage bezieht sich nicht speziell auf dieses Problem (-lwsock32 löst es). Das Problem ist das Fehlen von allgemeinem Wissen über das Verknüpfen. Mein Dozent an der Universität C++ sprach über das Verknüpfen für die Zeit einer Folie mit ein paar Black-Boxes darauf.

Auch Ressourcen zur Funktionsweise von Links sind knapp, und die meisten Leute, die ich kenne, betrachten Links immer noch als Black-Box-Operation. Was ich über das Verknüpfen gelernt habe, ist das Experimentieren, und irgendwie "hat es auf dem Weg aufgenommen", aber das Problem bei diesem Ansatz ist, dass es mehr Fragen aufwirft, als es beantwortet.

Zum Beispiel: Ich weiß. LIB-Dateien sind Bibliotheksdateien, die Bündel von Objektdateien sind. Nun, wie sollte man eine .LIB-Datei erstellen und verwenden? Wann ist es wünschenswert, eine .LIB-Datei zu verwenden? Wann sollte ich statische .LIB-Dateien oder solche, die auf DLLs verweisen, erstellen? Wenn ich eine .LIB-Datei mit meinen Objektdateien verknüpfe, wird alles hineinkopiert oder nur die Objektdateien, die ich verwende? Wann sollte ich DLLs/So-Dateien statt statisch verknüpfen? Muss ich etwas über die innere Struktur von Objektdateien lernen, um allgemeine Probleme zu lösen? Was muss ich über Namensmangel wissen? Wann ist es relevant? Kann ich mehrere verschiedene Standardbibliotheken mit meinem Projekt verknüpfen, wenn eine der DLLs die alte msvcrt lädt?

usw.

Die Frage

Offensichtlich erwarte ich keine Antwort auf alle oben in einem Rutsch aufgeführten Fragen. Ich muss nur wissen, wo ich anfangen soll. Gibt es eine Ressource wie "Was jeder Programmierer über das Gedächtnis wissen sollte", die über die Verknüpfung spricht? Also brauche ich Ressourcen, von denen ich lernen kann, und Ihre Erkenntnisse darüber, in welche Richtung ich gehen sollte, um über den Verknüpfungsprozess zu lernen.

Welche Dinge sollte jeder Entwickler über das Verknüpfen wissen?

+0

Die Sprache C++ unterstützt derzeit keine Module und Bibliotheken. Daher wird diese Unterstützung oft mit implementierungsspezifischen Spracherweiterungen durchgeführt.Stellen Sie besser dieselbe Frage für das spezifische Betriebssystem und den Compiler. –

+0

Die Art, wie es gemacht wird, ist in Posix und Fenstern sehr ähnlich. Sie haben .lib/.a Dateien. Sie haben .dll- und .so-Dateien. Sie haben _undefined reference_ errors auf beiden Systemen. Das Objektdateiformat ist unterschiedlich, aber es gibt eine Menge Gemeinsamkeiten. Diese Frage bezieht sich nicht auf das, was offizielle C++ - Dokumente über das Verknüpfen sagen. Ich weiß, dass der Standard besagt, dass die Verknüpfung _implementaion detail_ ist. Es geht um die gängigen Praktiken der Verknüpfung in der C++ - Welt. – Klaufir

+1

In Windows müssen Sie möglicherweise Dinge wie '__declspec (dllexport)' in C++ Code schreiben, in Unix kann es etwas wie '__attribute__ ((__visibility __ (" default ")))' für die Unterstützung der korrekten Verknüpfung sein. –

Antwort

2

Es gibt TONS von Ressourcen.

Ich denke, dass für einen "Anfänger" überwältigend sein könnte;)

Soweit "Windows", die Sie tun könnte schlimmer als hier zu starten:

Ich würde auch thi empfehlen s:

'Hope that :)

PS hilft:

Zur Erläuterung:

  • Sie wollen wissen, wie die Bits Sie' "kompiliert" (in Maschinencode) kommen alle durch "Verknüpfen" zusammen. Eine völlig berechtigte Frage :)

  • Es hilft auch ein wenig darüber zu wissen, wie das Maschinencode bezieht sich auf ein „laufendes Programm“ ...

  • ... und wie ein „laufendes Programm“ verwendet einige Bits von der (statischen) .exe und andere Bits von der dynamischen Laufzeit (.dll oder „verknüpfte Bibliotheken dynamisch).

  • Alle diese Details sind oft komplett plattform- und betriebssystemspezifische

  • Daher die (vielfältigen) Links.

Noch einmal, ich hoffe, dass all das mit Ihrer ersten Frage hilft.

0

Wenn Sie in der Programmierung/C++ beginnen, werde ich, indem er ein gutes Verständnis beginnen, wie eine statische und dynamische Bibliotheken arbeiten und macht ein paar Tutorials eine DLL und LIB zu machen. Google ist dein bester Freund dafür: Ich finde das zum Beispiel für: http://www.bogotobogo.com/cplusplus/libraries.php.

Beachten Sie, dass die Art und Weise Sie eine lib machen auf Ihrem C++ Compiler abhängt. Die, die ich auf meinem Kopf habe, sind eine integrierte Entwicklungsumgebung (IDE) wie Visual Studio oder auch der GNU C++ Compiler.

1

Ich empfehle das Lesen John Levine hoch "Linkers & Loaders". Der größte Teil des Buches ist available online here, aber Sie sollten das Buch kaufen und den Autor unterstützen. Dieses Buch hat mir eine Menge beigebracht, wie man wirklich in die Binärdateien eindringt.

0

Ein Punkt, den Sie kennen sollten, ist ODR, und insbesondere, was es für inline Symbole bedeutet.

Die wikipedia entry kann ein guter Anfang sein.