2008-10-21 5 views
3

J'ai trouvé comment configurer VC++ pour compiler du code dans un fichier .lib au lieu d'un fichier .exe, mais j'ai du mal à obtenir un lien lib avec mon autre .obj des dossiers.Problème de liaison d'une bibliothèque statique C++

Voici comment la bibliothèque et les dossiers d'application sont configurés. (Je ne sais pas si cela est juste)

AppFolder 
    App.sln 
    App.ncb 
    *.h 
    *.cpp 
    Debug 
    *.obj 
    App.exe 

et ailleurs sur le disque dur ...

LibraryFolder 
    lib 
    Library.lib 
    include 
    LibrarySolutionFolder 
     Library.sln 
     Library.ncb 
     *.h 
     *.cpp 
     Debug 
     *.obj 
     Library.lib 

J'ai #including les fichiers de bibliothèque * .h de mes applications de fichiers cpp, et tout compile bien. C'est juste quand il établit un lien que je reçois une liste de tous les fichiers .lib qui sont recherchés, et Library.lib n'est pas là même si je l'ai listé dans les répertoires VC++. Comment puis-je obtenir ce lien? (Et je suis Structurer les dossiers de la bibliothèque correctement?)

Répondre

10

Sur les propriétés du projet:

Propriétés de configuration -> Linker -> Entrée -> D'autres Dépendances

Ajoutez là-dedans.

Ou, dans votre fichier .h pour la bibliothèque, ajoutez:

#pragma comment(lib, "Library") 

Cela fera automatiquement pour vous. VC ne lie pas simplement la bibliothèque si vous incluez le fichier d'en-tête.

+0

Merci, ça marche maintenant – jeffythedragonslayer

0

Vous devez indiquer à l'éditeur de liens d'utiliser la bibliothèque. Pour de bonnes raisons: Vous avez déjà des milliers de bibliothèques dans votre dossier de bibliothèque. Si MSVC devait les rechercher tous à chaque fois que vous liez votre programme, il devrait parcourir des centaines de mégaoctets de données.

Cela prendrait beaucoup de temps, donc ce n'est pas fait par défaut. Pour VC, vous pouvez également donner un indice à l'éditeur de liens à l'intérieur de votre source. Pour ce faire, ajoutez la ligne suivante quelque part dans votre code source (l'en-tête de la lib peut être un bon endroit). Ce n'est pas une plate-forme indépendante, mais le moyen le plus pratique d'obtenir une librairie automatiquement liée à un projet utilisant MSVC.

Une autre solution consiste simplement à ajouter l'éditeur de liens aux paramètres du projet. Les informations pertinentes peuvent être trouvées dans les paramètres de l'éditeur de liens de votre projet. N'oubliez pas d'ajouter la lib aux configurations release et debug.

+2

L'utilisation de #pragma comment (lib, ...) avec des chemins absolus est plus que juste spécifique au compilateur. C'est "spécifique à votre machine" (sauf s'il s'agit d'un lecteur "subst" ou d'un mappage de lecteur réseau). L'option de chemin de recherche de l'éditeur de liens -L est meilleure (idem pour #include et -I). Mais bon, c'est "Works On My Machine" certifié. – bk1e

+0

Je pensais qu'il était évident que c'était un exemple, bk1e. Pensez-vous vraiment que j'ai un répertoire nommé "path_to_library" sur mon disque? * head hits table * –

+0

Un chemin commençant par une lettre de lecteur, suivi d'un deux-points et d'une barre oblique inverse est un chemin absolu. Si vous ne voulez pas suggérer d'utiliser un chemin absolu, ne suggérez pas d'utiliser un chemin absolu. '#pragma comment (lib," libname.lib ");' est vraiment suffisant (et plus proche de ce que vous verrez dans la majorité des cas). – IInspectable

3

Les répertoires VC++ représentent la liste des emplacements de répertoire à rechercher lors de la liaison. Il n'est pas une liste des bibliothèques à lier à.

Vous devez ajouter le fichier lib aux Dépendances supplémentaires domaine des projet Linker paramètres.

1

Pour créer un lien avec une bibliothèque, vous pouvez:

  • Liste dans Projet-> Propriétés ...-> Linker,> Dépendances supplémentaires entrées- (répertoires de VC ne vous permet d'utiliser seulement la. lib name plutôt le chemin complet),
  • Ajoutez le projet de bibliothèque à votre application. solution (Sur solution, clic droit -> Ajouter -> Projet existant ...), puis utilisez Projet -> Dépendances du projet ..., puis vérifiez votre projet de bibliothèque (assurez-vous que le projet d'application est sélectionné dans la liste déroulante). C'est probablement la meilleure solution si vous éditez les deux projets, car VC++ reconstruira la bibliothèque si elle a été modifiée avant de créer votre application.
  • Si vous êtes sûr que vous utilisez uniquement VC++,

    #pragma comment(lib,"C:\\path\\to\\library.lib")` 
    

    (Merci @Nils)

NB: Il semble très étrange d'avoir votre dossier de solution de bibliothèque dans un include répertoire: qui sont vraiment destinés à * .h (ou autres fichiers #include d).

+0

Cool, merci pour le heads up concernant le répertoire include. – jeffythedragonslayer

1

Depuis la ligne de commande:

cl/EHsc {} objfiles +/link /LIBPATH: LibraryFolder Library.lib

Où {} objfiles + signifie un ou plusieurs objets ou cpp des dossiers.

Questions connexes