Ich habe den Qt-Quellcode so gesehen:
class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
Welches Q_CORE_EXPORT
Makro definiert sich wie folgt:
define Q_DECL_IMPORT __declspec(dllimport)
Was bedeutet es also __declspec(dllimport)
wirklich?
Antworten:
__declspec
ist 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
dllimport
unddllexport
. 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. Siedllexport
markieren ein Symbol als aus einer DLL exportiert unddllimport
importieren 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:
Markieren Sie dann alle Symbole, mit denen exportiert werden soll
DLLEXPORT
.Vermutlich ist es das, was das
Q_CORE_EXPORT
Makro tut, indem es entwederQ_DECL_IMPORT
oder auflöstQ_DECL_EXPORT
.quelle
__declspec
Notation 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)
.quelle
__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
quelle
Dies bedeutet, dass sich die Definition der Funktion in einer dynamischen Bibliothek befindet. Weitere Details und Beispiele finden Sie in der Dokumentation .
quelle