2010-07-27 9 views
1

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.

  1. Créer un nouveau ATL Project nommé SomeProject. Acceptez tous les paramètres par défaut.
  2. Cliquez avec le bouton droit sur le projet dans l'Explorateur de solutions et sélectionnez Add > Class.
  3. Sélectionnez ATL Simple Object et entrez SomeObject 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).

  1. Cliquez avec le bouton droit sur le projet et sélectionnez Add > New Item.
  2. Sélectionnez Midl File et entrez ISomeObject comme nom de fichier.
  3. Ouvrez SomeProject.idl et réduisez la déclaration d'interface ISomeObject. Remplacez-le par import "ISomeObject.idl";.
  4. Collez la déclaration d'interface dans ISomeObject.idl.

Afin de satisfaire le compilateur IDL de Microsoft, nous avons besoin de changer certaines options:

  1. 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
  2. Aller à la section C/C++ > Precompiled Headers et définir Create/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 fichier SomeProject.idl pour afficher ses propriétés. Accédez à la section MIDL > Output et définissez Generate Type Library à Yes.
  3. Supprimer SomeProject_i.h et SomeProject_i.c du filtre Generated Files.
  4. 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?

Répondre

1

Vous ne savez pas exactement ce que vous faites ou pourquoi vous le faites, mais quelque part, vous avez perdu le fichier de code source blah_i.c généré par midl.exe. Il contient les GUID des interfaces, des coclasses et de la bibliothèque de types, ceux sur lesquels l'éditeur de liens se plaint. Si vous ne pouvez pas le retrouver, recherchez MIDL_DEFINE_GUID dans les fichiers * .c. Editer: Je vois le problème maintenant, vous avez renommé le blah_i.c blah_i.cpp. C'est faux, le fichier contient des déclarations C. Le compilateur modifie les identifiants différemment lorsqu'il est compilé en tant que code C++. Renommez le en .c. Ou utilisez l'option de compilation/Tc.

+0

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. –

+0

@emd: post mis à jour. –

+0

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. –

1

Ouvrez une invite de commande VS 2008 et accédez au répertoire intermédiaire/de sortie et consultez someproject_i.obj. Essayez quelque chose comme ceci:

dumpbin someproject_i.obj /symbols | find "LIBID" 

S'il n'y a pas de libid défini dans le fichier objet, c'est le problème. Peut-être qu'il a un mauvais nom? S'il y en a un avec le nom correct, alors le problème est que l'éditeur de liens ne l'utilise pas.

+0

Ceci est un bon outil de diagnostic, merci pour le conseil. –