2010-04-17 6 views
9

J'ai actuellement un projet de console qui crée un fichier .exe; Je veux aussi créer un fichier .lib afin que d'autres projets, compilés en tant que DLL, puissent appeler des fonctions du projet d'origine.Comment créer un fichier .lib et un fichier .exe dans Visual C++?

Je sais que c'est possible, mais je ne pouvais pas trouver comment faire cela. Comment puis-je dire à l'éditeur de liens d'associer également un fichier .lib?

Répondre

8

Ce n'est pas possible en général - les bibliothèques statiques et les exécutables sont des types d'animaux complètement différents. La façon de gérer cette situation est de créer deux projets - un pour la bibliothèque, qui contient toutes les fonctionnalités. et un pour l'exécutable, qui est un wrapper mince qui appelle simplement des fonctions dans la bibliothèque.

+0

Mais ici, j'ai un fichier vcproj qui se termine avec un exe et un lib ... Pourtant, pour la vie de moi, je ne pouvais pas trouver ce qui fait ça fait ça. http://svn.corecraft.org/aspire_mirror/trunk/win/VC90/hearthstone-world.vcproj – MoshiBin

+0

@Spidey Le projet contient vraisemblablement deux sous-projets. –

+0

convenu. Rendez le projet exe dépendant du projet lib et il sera automatiquement recompilé en cas de besoin. –

0

Vous ne "créez pas de lien", vous créez un projet de bibliothèque statique. Ce dernier n'appelle pas du tout l'éditeur de liens - à la place, il compile tous vos fichiers avec cl /c et combine les résultats .obj dans un fichier lib en utilisant lib.exe.

2

Si un symbole dans un projet d'application (.exe) est exportée (par exemple avec __declspec (dllexport)), à la fois le fichier .exe et les fichiers .lib seront générés Voir: Why does my Visual C++ .exe project build create .lib and .exp files?

+0

Ceci est correct w.r.t. la question dans le titre.Cependant, comment cela pourrait-il aider avec l'autre question dans le corps? "être capable d'appeler des fonctions du projet [EXE] original"? – MSalters

+0

Vous liez avec le fichier .lib généré; le .exe se comporte comme une DLL. c'est-à-dire que les symboles sont chargés à l'exécution à partir du fichier .exe. –

+0

J'ai testé ce que j'ai écrit dans le dernier commentaire. Il fonctionne parfois et parfois ne pas avec une erreur "Impossible d'initialiser l'application (0xC0000005)". En utilisant LoadLibrary et GetProcAddress je me retrouve avec des problèmes de mémoire. Donc en fait je ne sais pas comment utiliser correctement le fichier .lib généré. –

11

Affichage ce juste à titre de référence, je sais que le post original a été publié il y a longtemps, mais cela s'applique toujours à toute personne qui a besoin d'une solution à ce problème.

Aller au projet que vous souhaitez créer un fichier .lib et procédez comme suit:

  1. Faites un clic droit sur le projet.
  2. Sélectionnez Propriétés.
  3. Sélectionner les événements de construction.
  4. Sélectionnez l'événement de pré-liaison.
  5. Enfin dans la pâte ligne de commande suivante:

    @ECHO ON @ECHO "$(VC_ExecutablePath_x86)\lib.exe" /out:"$(OutDir)$(ProjectName).lib" "$(IntermediateOutputPath)*.obj" "$(VC_ExecutablePath_x86)\lib.exe" /out:"$(OutDir)$(ProjectName).lib" "$(IntermediateOutputPath)*.obj"

Ceci appellera l'outil lib pour générer le fichier lib sur des fichiers objets générés.

+0

Un peu en retard, mais je voulais vous remercier de toute façon :) Vous venez de me rendre la vie beaucoup plus facile –

+0

De rien. ;) –

+0

Dans mon cas, la localisation par défaut pour .obj était dans le dossier du projet, donc j'ai changé "$ (IntermediateOutputPath) *. Obj" en "$ (SolutionDir) $ (ProjectName) \ $ (Configuration) \ *. Obj" . ça fonctionne bien, merci. – elarmando

0

Il est étonnant combien de contributeurs arrogamment insiste sur une réponse qui est erronée, quand ils simplement ne connaissent pas la réponse.

Pour générer un .lib associé à votre place .exe la ligne suivante dans Préassociation l'événement:

"$ (VC_ExecutablePath_x86) \ lib.exe"/out: "$ (OutDir) $ (ProjectName) .lib "" $ (IntermediateOutputPath) *. obj "

+0

Cette technique semble fonctionner uniquement en mode débogage. – user6664090