Ich schaute auf diese Seite: An In-Depth Look into the Win32 Portable Executable File FormatWie funktionieren Import-Bibliotheken und warum benötigt MinGW sie nicht?
Es erklärt, dass der Linker eine Importbibliothek benötigt, da der Compiler nicht zwischen normalen Funktionsaufrufen und API-Funktionsaufrufen unterscheiden kann. Aber sie sagen auch, dass __declspec (dllimport) einen Funktionsaufruf als API-Aufruf spezifiziert, so dass der Linker gegen __imp_[function-name]
verlinkt. Aber mit diesem Schlüsselwort sollte der Compiler wissen, dass dies ein Aufruf einer API-Funktion ist.
Warum benötigt der Linker noch eine Importbibliothek? Der Compiler könnte dieses Symbol als importiert markieren, indem er dem Funktionsnamen __imp_
voranstellt und einen Funktionszeiger aufrufen könnte (der noch ein ungelöstes Symbol ist), und der Linker könnte dieses Symbol ersetzen (weil er sieht, dass dies ein API-Aufruf ist) die Adresse des IAT-Eintrags.
Und warum kann der MinGW-Linker "MinGW-DLLs" direkt verwenden, aber der Visual-Studio-Linker benötigt eine Import-Bibliothek?
Als ich den Beitrag las, wurden auch andere Fragen aufgeworfen. Wie kennt das "dlltool (oder linker)" (was auch immer die Import-Bibliothek erstellt) den Speicherort eines IAT-Eintrags, bevor die Verknüpfung mit der endgültigen ausführbaren Datei hergestellt wurde? Ich dachte, die IAT-Einträge würden bei der Link-Zeit mit der endgültigen ausführbaren Datei erstellt werden. Der Post sagte, dass jeder API-Aufruf eine feste Position in der IAT-Tabelle hat, egal wie viele DLLs verknüpft werden. Ich kann mir nicht vorstellen, wie das erreicht werden könnte.
[Dieser Beitrag] (http://stackoverflow.com/a/3573527/1881610) beantwortet die meisten Ihrer Fragen. – Phillip