Ich habe den Qt-Quellcode so gesehen:
class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
Welches Q_CORE_EXPORTMakro definiert sich wie folgt:
define Q_DECL_IMPORT __declspec(dllimport)
Was bedeutet es also __declspec(dllimport)wirklich?
Ich habe den Qt-Quellcode so gesehen:
class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
Welches Q_CORE_EXPORTMakro definiert sich wie folgt:
define Q_DECL_IMPORT __declspec(dllimport)
Was bedeutet es also __declspec(dllimport)wirklich?
Antworten:
__declspecist ein Microsoft-spezifisches Attribut, mit dem Sie Informationen zur Speicherklasse angeben können.
(Nitpicker's Corner: Einige andere Compiler-Anbieter - z. B. GCC - unterstützen diese Spracherweiterung jetzt, um die Kompatibilität mit der installierten Codebasis zu gewährleisten, die für Microsoft-Compiler geschrieben wurde. Einige bieten sogar zusätzliche Speicherklassenattribute.)
Zwei dieser Speicherklassenattribute, die angegeben werden können, sind dllimportund dllexport. Diese zeigen dem Compiler an, dass eine Funktion oder ein Objekt aus einer DLL importiert bzw. exportiert wird.
Insbesondere definieren sie die Schnittstelle der DLL zum Client, ohne dass eine module-definition ( .DEF) -Datei erforderlich ist . Die meisten Leute finden es viel einfacher, diese Spracherweiterungen zu verwenden, als DEF-Dateien zu erstellen.
Aus offensichtlichen Gründen __declspec(dllimport)und __declspec(dllexport)sind in der Regel miteinander gepaart. Sie dllexportmarkieren ein Symbol als aus einer DLL exportiert und dllimportimportieren dieses exportierte Symbol in eine andere Datei.
Aus diesem Grund und weil im Allgemeinen dieselbe Header-Datei sowohl beim Kompilieren der DLL als auch im Client-Code verwendet wird, der die DLL-Schnittstelle verwendet, ist es ein gängiges Muster, ein Makro zu definieren, das beim Kompilieren automatisch in den entsprechenden Attributbezeichner aufgelöst wird. Beispielsweise:
#if COMPILING_DLL
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif
Markieren Sie dann alle Symbole, mit denen exportiert werden soll DLLEXPORT.
Vermutlich ist es das, was das Q_CORE_EXPORTMakro tut, indem es entweder Q_DECL_IMPORToder auflöst Q_DECL_EXPORT.
__declspecNotation als Erweiterung der C ++ - Sprache erfunden . Ich glaube, dass GCC es jetzt unterstützt, aber das ist hauptsächlich aus Kompatibilitätsgründen mit den Compilern von Microsoft. Und ich verstehe nicht, wie sich "MS-spezifisch" von "Compiler-spezifisch" unterscheidet. Microsoft hat einen C ++ - Compiler geschrieben, den viele Benutzer verwenden. Es kommt mit Visual Studio.
__declspec(dllimport) ist ein Speicherklassenspezifizierer, der dem Compiler mitteilt, dass eine Funktion, ein Objekt oder ein Datentyp in einer externen DLL definiert ist.
Die Funktion oder das Objekt oder der Datentyp wird aus einer DLL mit einer entsprechenden exportiert __declspec(dllexport).
__declspec(dllexport)Weist den Compiler an, den Linker darüber zu informieren, dass diese Symbole in die Exporttabelle eingefügt werden müssen (beim Kompilieren der DLL). Weist __declspec(dllimport)den Compiler beim Kompilieren des Programms, das mit der DLL verknüpft ist, an, einen Rip-relativen absoluten Register-indirekten indirekten Aufruf (den der Linker mit der Auflösung ausfüllt, um auf die Importtabelle zu verweisen) anstelle des üblichen Rip-relativen Registers direkt aufzurufenIndirekter Aufruf einer undefinierten Funktion (die den Befehl nicht ändern kann, fügt der Linker die relative Adresse eines Thunks ein und erstellt dann den Thunk, in dem er den rip-relativen absoluten Register-indirekten indirekten Aufruf an den platziert Funktionszeiger in der Importtabelle). Dies ist eine Optimierung der Codegröße und Geschwindigkeit. Es ist die .lib der Importbibliothek, die dem Linker mitteilt, welche Symbole importiert werden, und die als Leitfaden zum Erstellen der Importtabelle und zum Erstellen aller erforderlichen Thunks im .text-Segment verwendet wird.
https://docs.microsoft.com/en-us/cpp/build/importing-function-calls-using-declspec-dllimport?view=vs-2019 https://docs.microsoft.com/en-us/cpp / build / importing-data-using-declspec-dllimport? view = vs-2019 https://stackoverflow.com/a/4490536/7194773
Dies bedeutet, dass sich die Definition der Funktion in einer dynamischen Bibliothek befindet. Weitere Details und Beispiele finden Sie in der Dokumentation .