L'importation .dll dans Qt
Je veux apporter une .dépendance dll dans mon projet Qt.
J'ai donc ajouté à mon .pro fichier:
win32 {
LIBS += C:\lib\dependency.lib
LIBS += C:\lib\dependency.dll
}
Et puis (je ne sais pas si c'est la bonne syntaxe ou pas)
#include <windows.h>
Q_DECL_IMPORT int WINAPI DoSomething();
btw le .dll ressemble à quelque chose comme ceci:
#include <windows.h>
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call,
LPVOID lpReserved)
{
return TRUE;
}
extern "C"
{
int WINAPI DoSomething() { return -1; }
};
D'erreur: symbole non?
Note: je ne suis pas expérimenté avec .dll à l'extérieur .NET ez pz assemblée de l'architecture, certainement un n00b.
OriginalL'auteur Bad Man | 2010-04-07
Vous devez vous connecter pour publier un commentaire.
Votre "LIBS +=" syntaxe est incorrecte. Essayez ceci:
Je suis également pas sûr si le fait d'avoir des chemins absolus avec une lettre de lecteur dans votre .fichier pro est une bonne idée, j'ai l'habitude de garder les dépendances quelque part dans l'arborescence du projet et d'utiliser un chemin relatif.
EDIT:
Je suppose que quelque chose est incorrect dans votre fichier dll, c'est à dire les symboles ne sont pas exportés correctement. J'ai toujours utiliser le modèle fourni par QtCreator:
À l'intérieur de dll projet, il n'est mydll_global.h-tête avec du code comme ça:
Dll projet a DÉFINIT += MYDLL_LIB à l'intérieur du fichier pro.
Exportés de la classe (ou uniquement les méthodes sélectionnées) et de fonctions libres sont marqués avec MYDLL_EXPORT à l'intérieur de fichiers d'en-tête, c'est à dire
OriginalL'auteur chalup
Cela est possible si la DLL contient des fichiers avec un "C" de la liaison (c'est à dire pas de classe C++ décorations) et si vous avez un fichier d'en-tête et un .def fichier de la DLL. Si vous n'avez pas un .def fichier, vous pouvez en créer un facilement en téléchargeant l'outil dependency walker de http://www.dependencywalker.com/ pour obtenir la liste des symboles exportés; vous pouvez enregistrer la sortie de cet outil en tant que texte, puis d'en extraire les noms. Ensuite, vous créez un fichier texte appelé mylibname.def qui contient:
Ensuite, vous exécutez dlltool (MinGW\bin):
Cela va générer mylibname.un, que vous ajoutez dans votre .pro fichier:
Vous devez fournir des chemins d'accès à tous les fichiers, ou de les copier dans les dossiers de droit, bien sûr.
Vous devez également modifier le fichier d'en-tête de votre programme tiers, de sorte que tous les symboles dans la DLL que vous avez besoin de lien vers sont marqués pour l'importation avec Q_DECL_IMPORT. Pour ce faire, j'
déclarer toutes les fonctions dans les .h du fichier:
où MYLIBAPI est
Nous utilisons le MYLIBAPI(retType) format car cela nous permet d'adapter le fichier d'en-tête pour une utilisation à la fois l'importation et lors de la création de la Dll et il nous permet également de travailler avec une grande variété de différents compilateurs et systèmes.
Faisant cela, j'ai réussi à relier QT dans MinGW à une DLL que je génère à l'aide de VS 2005. Les routines de VS sont exportés __stdcall. Vous devriez regarder la dlltool de la documentation pour l'ajout de souligne ou d'autres préfixes pour les noms dans la bibliothèque.
OriginalL'auteur Greg Smith
Vous devez faire la déclaration de la fonction à la disposition de l'éditeur de liens ainsi que de fournir le chemin d'accès à la dll dans lequel il se trouve. Habituellement, cela se fait par #, y compris un fichier d'en-tête qui contient la déclaration.
Vous n'avez pas besoin de la Q_DECL_IMPORT macro dans le client - ce qui serait utilisé dans une bibliothèque Qt de l'en-tête pour permettre aux clients des applications pour importer la fonction. Une classe ou d'une fonction serait conditionnellement exportés/importés selon que la bibliothèque ou un client est en cours de construction. Plus d'informations peuvent être trouvées sur cette page.
Est votre dépendance à un tiers dll ou quelque chose que vous avez créé?
Vous n'avez pas dit si c'était un compilateur ou l'éditeur de liens d'erreur ou même compilateur que vous utilisez.
OriginalL'auteur Stu Mackellar