Beim Versuch, einige Linker-Fehler zu debuggen, habe ich / VERBOSE eingeschaltet und versuche, die Ausgabe zu verstehen. Es fällt mir auf, dass ich wirklich nicht weiß, wie man es liest.
Zum Beispiel:
%Vor%Was ist hier los?
Ich glaube, ich verstehe dieses bisschen:
%Vor%Es wird versucht, die Implementierung des obigen Operators zu finden, der irgendwo in FocusDlg.cpp verwendet wird, und er findet ihn in geometry.lib.
Aber was bedeutet 1>Processed /DEFAULTLIB:libgslcblasMD.lib
? Was bestimmt die Reihenfolge der Symbolauflösung? Warum lädt es dieses bestimmte Symbol während der Verarbeitung von libgslcblasMD.lib
, das eine Bibliothek von Drittanbietern ist? Oder lese ich es falsch?
Es scheint, dass der Linker die Symbole durchläuft, auf die in den verschiedenen Objektdateien des Projekts verwiesen wird, aber ich habe keine Ahnung in welcher Reihenfolge. Es durchsucht dann die statischen Bibliotheken, die das Projekt verwendet - durch Projektreferenz, expliziten Import und automatische Standardbibliotheksimporte; aber es geschieht in einer Reihenfolge, die mir wiederum willkürlich erscheint.
Wenn es ein Symbol findet, zum Beispiel in geometry.lib, findet es weiterhin eine Menge anderer Symbole aus derselben Bibliothek:
%Vor%Aber dann, aus irgendeinem Grund, geht es weiter, um Symbole zu finden, die in anderen Bibliotheken definiert sind, und kehrt später zur Geometrie zurück (ein paar Mal).
Es geht also nicht darum, "in Geometrie zu schauen und jedes Symbol zu laden, das Referenzen in dem Projekt ist, und dann zu anderen Bibliotheken weiterzugehen". Aber mir ist nicht klar, was ist die Reihenfolge der Symbolsuche.
Und wie sieht es mit all diesen Bibliotheken aus, die zu Beginn der Linker-Arbeit verarbeitet werden, aber keine Symbole finden, die von ihnen geladen werden? Verwendet dieses Projekt wirklich nichts von msvcrt.lib
, kernel32.lib
? Scheint unwahrscheinlich.
Im Grunde genommen suche ich die zugrundeliegende Reihenfolge in der Linker-Operation zu entschlüsseln.
Die Suche nach zu verknüpfenden Symbolen beginnt am Eingangspunkt Ihrer App (main oder WinMain). Von dort erhält der Linker alle Symbole, von denen der Einstiegspunkt abhängt, lädt seine eigenen Abhängigkeiten und so weiter, bis keine Abhängigkeiten mehr bestehen.
In älteren Linkern wäre jede .obj, die im Hauptprojekt enthalten ist, notwendigerweise verknüpft, und daher sollten ihre Abhängigkeiten im Projekt vorhanden sein, damit die Verbindung erfolgreich ist. Heutzutage entfernen die meisten Linker Code, der niemals verwendet wird, auch wenn er in explizit verknüpften Obj-Dateien enthalten ist.
Über 1>Processed /DEFAULTLIB:libgslcblasMD.lib
: Dies bedeutet einfach, dass die Bibliotheksdatei gescannt wurde und ihre Symbole an ein Wörterbuch angehängt wurden, um sie später für die Auflösung von Abhängigkeiten zu verwenden.
Die Reihenfolge, in der die Auflösung auftritt, steht nicht unbedingt in Zusammenhang mit der Reihenfolge, in der die Bibliotheksdateien verarbeitet werden. Wenn der Linker eine Lib verarbeitet, fügt er einfach seine Symbole zum Wörterbuch hinzu. Die Auflösung der Abhängigkeiten erfolgt, nachdem das Wörterbuch gefüllt wurde, beginnend am Haupteingangspunkt, wie oben erwähnt.
Tags und Links c++ visual-c++ linker