web-dev-qa-db-fra.com

Build Succeeded, mais aucun fichier .lib n'est créé

J'ai hérité d'une quantité substantielle de code, y compris un projet Visual Studio qui est censé (autant que je sache) créer un fichier .lib. Visual studio dit "... Génération de code ... Création d'une bibliothèque ... Création d'un fichier d'informations de navigation ...", et à la fin, il indique que la construction a réussi. Dans le dossier release/debug, il contient un tas de fichiers .obj, mais pas de fichier .lib. Que pourrais-je manquer?

Merci!

47
Jim

Ouvrez les propriétés du projet (cliquez avec le bouton droit sur le projet dans l'Explorateur de solutions, sélectionnez "Propriétés"). Sous "Bibliothécaire", cochez "Fichier de sortie" - c'est là que la sortie doit aller.

Si cela vous semble correct, essayez dir /s *.lib dans un sous-répertoire approprié pour votre projet, pour voir si vous pouvez localiser la bibliothèque de sortie par date et heure. Si vous ne le trouvez toujours pas, essayez une nouvelle reconstruction (cliquez avec le bouton droit sur le projet, sélectionnez "Reconstruire").

Pour les DLL, un fichier .Lib n'est pas créé si le DLL n'exporte rien pour un usage externe. Je ne pense pas que cela s'applique aux constructions de bibliothèques statiques, mais je m'assurerais que vous exportez quelque chose de public depuis le code source de votre projet de bibliothèque.

64
Steve Townsend

.lib ne sera pas généré si vous manquez d'ajouter le préfixe __declspec (dllexport) pour les méthodes.

15
snb

Ma bibliothèque statique ne contient que deux classes de modèles, donc je n'avais pas de fichier .cpp. Cela a empêché Visual Studio 2015 de générer un fichier .lib. Pour résoudre ce problème, j'ai créé un fichier huh.cpp qui comprend tous les en-têtes.

12
Grault

J'ai également rencontré ce problème.

Cela était dû à l'utilisation d'une macro non valide dans la définition du répertoire de sortie. Dans mon cas, c'était enter image description here

quand il aurait dû être

enter image description here

J'ai dû effacer le chemin complet dans la deuxième capture d'écran. J'ai eu une macro incorrecte. J'utilisais MsBuildProjectDir alors que j'aurais dû utiliser MsBuildProjectDirectory. La zone de texte en lecture seule affichera le chemin complet (par exemple: C:\Development\blah\blah\blah\) lorsque le répertoire de sortie est valide. Si le répertoire de sortie n'est pas valide, vous obtiendrez quelque chose comme la première capture d'écran.

2
CHendrix

J'ai eu le même problème, même si j'utilisais déjà la fonction __declspec(dllexport).

Votre ProjectName.cpp le fichier doit #include "ProjectName.h". Si vous n'incluez pas le fichier d'en-tête, les fonctions ne sont pas exportées. Le DLL construit correctement, pas d'erreurs ou d'avertissements (au moins dans VS2017 15.8), mais vous n'obtenez pas de fichier LIB.

Inclure l'en-tête et la flèche - le fichier LIB est généré. Une erreur de débutant, je suis sûr, mais tout le monde doit commencer à apprendre quelque part.

2
Chuck

Si les méthodes que vous souhaitez exporter sont dans une classe, vous devez __declspec(dllexport) sur la classe. Sinon, aucun .lib ne sera créé.

2
Crubuntu

Dans le projet DLL, mettez __declspec (dllexport) débuts des méthodes définies dans les fichiers .h et .cpp.

Après tout, compilez à nouveau votre dll, afin que le fichier .lib soit généré et prêt pour la liaison.

put Class Foo
{
public:
    __declspec(dllexport) int GetFoo() const;
0
Gravitas