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?
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. –
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
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. –