J'ai travaillé sur la compilation d'un projet ATL de base dans Visual Studio 2008 et je continue de rencontrer des erreurs. En fin de compte, je suis coincé avec les Gotten erreurs suivantes construire:Le projet ATL créé à l'aide de l'assistant ne compile pas en raison de symboles non résolus
1>Linking...
1> Creating library Debug\SomeProject.lib and object Debug\SomeProject.exp
1>dllmain.obj : error LNK2001: unresolved external symbol _LIBID_SomeProjectLib
1>SomeObject.obj : error LNK2001: unresolved external symbol _LIBID_SomeProjectLib
1>SomeObject.obj : error LNK2001: unresolved external symbol _IID_ISomeObject
1>Debug\SomeProject.dll : fatal error LNK1120: 2 unresolved externals
Qu'est-ce que je méconnais ou faire du tort? Voici les étapes à reproduire.
- Créer un nouveau
ATL Project
nomméSomeProject
. Acceptez tous les paramètres par défaut. - Cliquez avec le bouton droit sur le projet dans l'Explorateur de solutions et sélectionnez
Add > Class
. - Sélectionnez
ATL Simple Object
et entrezSomeObject
comme nom abrégé. Acceptez tous les autres paramètres par défaut.
À ce stade, le projet se construit bien. Cependant, je veux diviser mon IDL entre plusieurs fichiers pour une meilleure organisation (mon IDL serait long de milliers de lignes).
- Cliquez avec le bouton droit sur le projet et sélectionnez
Add > New Item
. - Sélectionnez
Midl File
et entrezISomeObject
comme nom de fichier. - Ouvrez
SomeProject.idl
et réduisez la déclaration d'interfaceISomeObject
. Remplacez-le parimport "ISomeObject.idl";
. - Collez la déclaration d'interface dans
ISomeObject.idl
.
Afin de satisfaire le compilateur IDL de Microsoft, nous avons besoin de changer certaines options:
- clic droit sur le projet et ouvrir ses propriétés. Aller à la
MIDL > Output
section et entrez les valeurs suivantes:- tête de fichier:
$(InputName).h
- IID fichier:
$(InputName)_i.cpp
- Fichier Proxy:
$(InputName)_p.cpp
- Générer la bibliothèque de type:
No
- tête de fichier:
- Aller à la section
C/C++ > Precompiled Headers
et définirCreate/Use Precompiled Header
àNot using Precompiled Header
. Il y a des erreurs plus tard si les en-têtes précompilés sont utilisés. Sélectionnez le fichierSomeProject.idl
pour afficher ses propriétés. Accédez à la sectionMIDL > Output
et définissezGenerate Type Library
àYes
. - Supprimer
SomeProject_i.h
etSomeProject_i.c
du filtreGenerated Files
. - Ajoutez les éléments existants suivants au filtre
Generated Files
. Vous devrez peut-être essayer de compiler le projet en premier.SomeProject.h
SomeProject_i.cpp
ISomeObject.h
ISomeObject_i.cpp
Maintenant, à ce stade, j'attendre le projet de compilation. Mais ce n'est pas le cas. Vous devriez obtenir les erreurs LNK1120
que j'ai énumérées en haut de cette question.
Des idées? Est-ce que je regarde quelque chose de simple?
J'essaye juste de mettre en place un projet ATL simple. Le seul vrai changement que je fais est de déplacer la définition de l'interface dans son propre fichier IDL. Les fichiers IID sont générés et inclus très bien. Voir la dernière étape que j'ai prise dans la mise en place du projet. –
@emd: post mis à jour. –
OMFG ... nom mangling ... comment insidieux. J'avais l'impression que la compilation sous C++ était supportée par #ifdef __cplusplus dans les fichiers générés. –