J'ai vu le code source de Qt comme ceci:
class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
Quelle Q_CORE_EXPORT
macro définit comme ci-dessous:
define Q_DECL_IMPORT __declspec(dllimport)
Alors qu'est-ce que ça __declspec(dllimport)
veut vraiment dire?
Réponses:
__declspec
est un attribut spécifique à Microsoft qui vous permet de spécifier des informations de classe de stockage.(Nitpicker's Corner: Cependant, un certain nombre d'autres fournisseurs de compilateurs - par exemple GCC - prennent désormais en charge cette extension de langage pour la compatibilité avec la base de code installée qui a été écrite pour les compilateurs de Microsoft. Certains fournissent même des attributs de classe de stockage supplémentaires.)
Deux de ces attributs de classe de stockage qui peuvent être spécifiés sont
dllimport
etdllexport
. Ceux-ci indiquent au compilateur qu'une fonction ou un objet est importé ou exporté (respectivement) à partir d'une DLL.Plus spécifiquement, ils définissent l'interface de la DLL avec le client sans avoir besoin d'un
.DEF
fichier module-definition ( ). La plupart des gens trouvent qu'il est beaucoup plus facile d'utiliser ces extensions de langage que de créer des fichiers DEF.Pour des raisons évidentes,
__declspec(dllimport)
et__declspec(dllexport)
sont généralement jumelés les uns aux autres. Vous utilisezdllexport
pour marquer un symbole comme exporté à partir d'une DLL et vous utilisezdllimport
pour importer ce symbole exporté dans un autre fichier.Pour cette raison, et comme le même fichier d'en-tête est généralement utilisé à la fois lors de la compilation de la DLL et dans le code client qui consomme l'interface de la DLL, il s'agit d'un modèle courant pour définir une macro qui se résout automatiquement en spécificateur d'attribut approprié au moment de la compilation. Par exemple:
Et puis en marquant tous les symboles avec lesquels exporter
DLLEXPORT
.Vraisemblablement, c'est ce que fait la
Q_CORE_EXPORT
macro, résolvant soitQ_DECL_IMPORT
ouQ_DECL_EXPORT
.la source
__declspec
notation comme une extension du langage C ++. Je pense que GCC le prend désormais en charge, mais c'est principalement pour des raisons de compatibilité avec les compilateurs de Microsoft. Et je ne comprends pas en quoi «spécifique à MS» est différent de «spécifique au compilateur». Microsoft a écrit un compilateur C ++ et beaucoup de gens l'utilisent. Il est livré avec Visual Studio.__declspec(dllimport)
est un spécificateur de classe de stockage qui indique au compilateur qu'une fonction, un objet ou un type de données est défini dans une DLL externe.La fonction ou l'objet ou le type de données est exporté à partir d'une DLL avec un fichier
__declspec(dllexport)
.la source
__declspec(dllexport)
indique au compilateur d'informer l'éditeur de liens que ces symboles doivent être placés dans la table d'exportation (lors de la compilation du fichier .dll). Lors de la compilation du programme qui relie avec le fichier .dll,__declspec(dllimport)
indique au compilateur de produire un appel indirect indirect indirect de registre absolu relatif à la déchirure (que l'éditeur de liens remplira pour pointer vers la table d'importation) plutôt que l'habituel registre direct relatif à ripinstruction d'appel indirect à une fonction indéfinie (qui, comme il ne peut pas modifier l'instruction, l'éditeur de liens insère l'adresse relative d'un thunk puis crée le thunk, à l'intérieur duquel il place l'appel indirect indirect de registre absolu relatif à la déchirure vers le pointeur de fonction dans la table d'importation). Il s'agit d'une optimisation de la taille et de la vitesse du code. C'est la bibliothèque d'importation .lib qui indique à l'éditeur de liens les symboles qui seront importés et est utilisée comme guide pour créer la table d'importation et créer tous les thunks nécessaires dans le segment .text.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
la source
Cela signifie que la définition de la fonction se trouve dans une bibliothèque dynamique. Reportez-vous à la documentation pour plus de détails et d'exemples.
la source