2009-02-20 8 views
10

J'ai ajouté un projet dll à ma solution et je l'ai explicitement référencé par un projet exécutable. L'exécutable se plaint qu'il ne peut pas trouver la lib.Le fichier .lib n'est pas créé (VS2008)

Des idées comment définir le projet pour créer le fichier lib requis? Et peut-être pourquoi le projet n'en créerait pas un?!?

Vive

NOTE J'ai cherché le projet et le fichier n'est pas créé partout.

Répondre

12

Dans l'onglet Linker -> Propriétés avancées du projet DLL, vérifiez que la valeur de Import Library (le fichier .lib que vous recherchez) est correcte/raisonnable. La valeur de cette propriété déterminera le nom de la bibliothèque d'importation et l'endroit où l'éditeur de liens l'écrira. Vous pouvez également avoir besoin de générer un fichier de définition d'importation (.def) dans votre projet, ou vérifier vos fichiers d'en-tête et vous assurer que vos fonctions exportées sont marquées avec le qualificateur __declspec (dllexport) dans le fichier d'en-tête. Ceci est habituellement basculée par un #define tels que:

#ifdef MYAPI_EXPORTS 
#define MYAPI_API __declspec(dllexport) 
#else 
#define MYAPI_API __declspec(dllimport) 
#endif 

void MYAPI_API foo(int bar); 

Fondamentalement, vous voulez que le compilateur voir dllexport quand il construit la bibliothèque, mais dllimport lorsque votre code client est #including le fichier d'en-tête. Si Visual Studio a généré la structure de projet de base, il a probablement déjà créé un #define approprié à utiliser.

Vous n'avez pas besoin de créer le fichier .def et d'ajouter le dllexport, juste l'un ou l'autre. Je préfère ce dernier. En outre, si vous choisissez d'utiliser un fichier .def, vous devez le spécifier dans les propriétés de l'éditeur de liens de votre projet de bibliothèque.

+0

La valeur est définie sur $ (TargetDir) $ (TargetName) .lib qui est la même valeur d'autres DLL que j'ai dans le projet qui fonctionnent. –

+0

C'est vraiment étrange, pouvez-vous ajouter le commutateur de ligne de commande manuellement (dans la feuille de propriétés de la ligne de commande) pour spécifier la bibliothèque d'importation? Tels que /IMPLIB:C:\MyDll.lib? – Jeremy

+0

J'ai ajouté ce commutateur à la fois à la ligne de commande de l'éditeur de liens et à la ligne de commande du compilateur et le fichier spécifié n'a pas été créé ... il refuse simplement de créer une bibliothèque lib!?! –

1

Avez-vous inclus le fichier lib dans Propriétés du projet-> Lieur-> Feuille d'entrée dans Exe Project.

Et assurez-vous également que vous avez inclus les références supplémentaires dans l'onglet Linker.

+0

J'ai fait :( mais parce que ce n'est pas en cours de création, c'est un point d'inhibition? –

+0

Indique si le compilateur génère une erreur lors de la création du fichier lib? Vérifiez l'emplacement $ (OutDir) \ $ (ProjectName) pour lib – Vinay

+0

Il n'y a pas d'erreurs lancées (autre que celle se plaignant que le fichier lib n'existe pas) et la lib n'existe nulle part dans le projet. –

1

Vérifiez le projet qui génère la DLL. S'il ne produit pas de .lib, vous ne l'avez probablement pas dit. Vous pouvez modifier la sortie du projet d'une DLL à une bibliothèque statique dans Propriétés-> Général-> Type de configuration (choisissez Bibliothèque statique .lib)

+0

Vous supposez que vous pouvez changer le type de projet. Ma compréhension est que dll (qui ne sont pas liés dynamiquement) ont pour créer des bibliothèques. Sinon, ils sont inutiles? –

+0

Si c'est le cas, vos propriétés sont toujours fausses. Vous devez vérifier où va votre fichier .lib. Si c'est tout le problème, alors vérifiez Properties-> Linker-> Import Library, et voyez où vous créez votre fichier lib. –

+0

son défini à $ (TargetDir) $ (TargetName) .lib Qui est le même paramètre que d'autres DLL dans la solution qui fonctionnent bien. –

4

J'ai déjà vu cela auparavant. Et en fait vient de frapper est encore récemment. Un fichier .lib n'est pas créé si rien n'est exporté. Les fonctions d'exportation se produisent de deux manières.

1) marquer une fonction avec __declspec (dllexport).

OU

2) Utilisez un fichier .def qui énumère toutes les fonctions qui doivent être exportés.

Solution:

1) nécessite généralement un indicateur de compilation à régler pour activer un bloc préprocesseur pour régler certains #define au __declspec(). Quelqu'un d'autre a énuméré cela dans leur message.

2) Requiert le paramétrage de la ligne Propriétés-> Lieur-> Entrée-> Fichier de définition de module.

Questions connexes