L'exportation de DLL C++ de la Classe , question à propos de .fichier def
Je veux utiliser la liaison implicite dans mon projet , et nmake veut vraiment un .fichier def . Le problème , c'est que c'est une classe , et je ne sais pas quoi écrire dans la section exports .
Quelqu'un pourrait-il me diriger dans la bonne direction ?
Le message d'erreur est le suivant :
NMAKE : U1073: vous ne savez pas comment faire 'DLLCLASS.def'
P. S: je suis en train de construire à l'aide de Windows CE Platform Builder .
À l'aide d'un .Fichier DEF est la pire façon d'exportation de code C++. J'espère que le dllimport/dllexport mots-clés décrites par Greg Hewgill peut être utilisé dans votre cas, comme le montre ce MME lien: msdn.microsoft.com/en-us/library/ms924233.aspx
OriginalL'auteur Vhaerun | 2008-10-09
Vous devez vous connecter pour publier un commentaire.
Vous pouvez toujours trouver le nom décoré pour la fonction de membre en utilisant dumpbin /symboles myclass.obj
dans mon cas
la
dumpbin
dump a montré le symbole??0A@@QAE@H@Z (public: __thiscall A::A(int))
Mettre ce symbole dans le .fichier def causes de l'éditeur de liens pour créer le A::A(int) symbole dans l'exportation de symboles.
MAIS! @paercebal déclare dans son commentaire: la saisie manuelle des décorés (mutilé) noms est une corvée - erreur sur le ventre, et malheureusement, pas de garantie d'être portable sur l'ensemble des versions de compilateur.
OriginalL'auteur xtofl
Si je me souviens correctement, vous pouvez utiliser
__declspec(dllexport)
sur le classe, et VC++ va créer automatiquement des exportations de l'ensemble des symboles liés à la classe (constructeurs et destructeur, les méthodes, la vtable, typeinfo, etc).Microsoft a plus d'informations sur ce ici.
OriginalL'auteur Greg Hewgill
J'ai trouvé la meilleure voie pour être un résumé de l'usine.
Commencez par définir une purement virtuel de la classe de base. C'est une classe sans la mise en œuvre, purement virtuel de l'interface de la classe.
Vous pouvez exporter cette base virtuelle "interface abstraite" de la classe, mais il n'y a pas vraiment de raison de le faire. Lorsque l'appelant utilise, ils seront à l'utiliser via un pointeur (PImpl, ou un Pointeur vers la mise en Œuvre) de sorte que tous les appelant connaît est une simple adresse de mémoire. Un fichier Def, tandis qu'un teensy peu plus de travail à suivre, offre des avantages au-delà de ce qu' __declspec(dllexport) peut atteindre. Quels sont les avantages, vous demandez-vous? Nous allons arriver à cela, il suffit d'attendre.
Avez votre vraie classe publiquement hériter de la base virtuelle. Maintenant, créez une méthode de fabrique de construire votre objet et un "libération"ish" callable " destructeur pour effectuer le nettoyage. Le nom de ces méthodes quelque chose comme "ConstructMyClass" et "ReleaseMyClass". S'il vous plaît, veuillez remplacer "MyClass" 🙂
Ceux usine /release méthodes ne doivent pas prendre POD types si elle a besoin de paramètres (plaine-vieux-données: integer, char, etc.). Le type de retour doit être votre virtual interface abstraite de la classe de base -- ou plutôt, un pointeur vers elle.
IMyClass* CreateAnObjectOfTypeIMyClass();
C'est peut-être maintenant évident pourquoi nous avons besoin de la classe de base virtuelle? Depuis l'interface virtuelle de la classe n'a pas de mise en œuvre, c'est l'essentiel, tous les types POD (sorte de) de sorte que le "type de données" de la classe peuvent être compris par la plupart des appelants, tels que Visual Basic, C ou très différents compilateurs C++.
Si vous êtes assez de fantaisie, vous pouvez obtenir autour de la nécessité d'une "déblocage manuel" méthode (désolé, fallait le faire). Comment? Gérer vos propres ressources dans la classe par le biais de smart-pointeurs et un pImpl type d'architecture ainsi, lorsque l'objet ne meurt pas, il va nettoyer après lui-même. Cela signifie que votre classe est, dans les mots immortels de notre saint et sauveur Scott Meyers, "facile à utiliser correctement et difficile à utiliser de manière incorrecte" en permettant à l'appelant ignorer le besoin de nettoyer. Laissez ceux d'entre nous qui n'ont jamais oublié d'appeler ".fermer" jette la première pierre.
Peut-être cette architecture semble familier? Il doit, en gros, c'est une micromachine version de COM. Ainsi, de la sorte, au moins le concept de l'interface, de l'usine de la construction et de la libération.
À la fin que vous avez exporté à l'interface de votre classe, fabriqué (et exportés) Créer et Détruire méthodes, et maintenant, les appelants peuvent invoquer votre PleaseConstructMyClass usine fonction de votre DLL retour entièrement construit, entièrement mis en œuvre et entièrement cuits objet sous l'apparence de son interface. Ils peuvent appel à toutes les méthodes publiques de la classe (au moins ceux dans votre résumé à l'interface virtuelle) et de faire toutes les choses amusantes.
Quand ils sont finis avec l'objet qui a été renvoyée par la fonction de fabrication, alors ils peuvent appeler un "ReleaseMyClass de la fonction" demander votre fichier DLL pour nettoyer l'objet de ses ressources, ou vous pouvez les aider dans leur travail en faisant votre classe de nettoyer lui-même, de faire le "ReleaseMyClass" méthode redondante et inutile.
Si quelqu'un est intéressé par les gains spécifiques & compromis pour l'utilisation du fichier Def et l'interface (en plus de ma aveugles dis-donc), veuillez pipe et on peut creuser plus profond.
N'avez-vous pas aimer ce genre de choses?
Ne pas utiliser la STL classes telles que les unique_ptr, shared_ptr, de cordes et de vecteur de retour ou d'argument, les types de briser tous les cross compilateur (pensez MSVC-MinGW) compatibilité?
OriginalL'auteur Allbite
La solution est la suivante :
depuis une classe est exporté,vous devez également ajouter les méthodes exportées dans le .fichier def
Je n'ai pas trouvé comment exporter un constructeur , donc je suis allé avec l'aide d'une méthode de fabrique ( statique ) , qui sera de retour de nouvelles instances d'un objet
les autres fonctions seront exportés par l'ajout de la normale de l'exportation de la déclaration dans la .fichier def
Espère que quelqu'un va bénéficier de cette information .
Toutes les trois points de balle sont fausses: voir __declspec ci-dessus.
OriginalL'auteur Vhaerun