Ayant des problèmes pour lier une bibliothèque statique C ++
Question
J'ai compris comment configurer VC ++ pour compiler le code dans un fichier .lib au lieu d'un fichier .exe, mais je ne parviens pas à faire la liaison d'une lib avec mes autres fichiers .obj.
Voici comment j’ai configuré les dossiers de la bibliothèque et de l’application. (Je ne sais pas si c'est vrai.)
AppFolder
App.sln
App.ncb
*.h
*.cpp
Debug
*.obj
App.exe
et quelque part sur le disque dur ...
LibraryFolder
lib
Library.lib
include
LibrarySolutionFolder
Library.sln
Library.ncb
*.h
*.cpp
Debug
*.obj
Library.lib
J'ai # compris les fichiers * .h de la bibliothèque à partir des fichiers cpp de mon application, et tout est bien compilé. C’est juste au moment où je crée un lien que j’obtiens une liste de tous les fichiers .lib Les fichiers qui sont recherchés et Library.lib ne sont pas présents même si les répertoires sont répertoriés dans VC ++. Comment puis-je obtenir ce lien? (Et est-ce que je structure correctement les dossiers de la bibliothèque?)
La solution
Sur les propriétés du projet:
Propriétés de configuration - > Lieur - > Entrée - > Dépendances supplémentaires
Ajoutez-le ici.
Ou, dans votre fichier .h pour la bibliothèque, ajoutez:
#pragma comment(lib, "Library")
Ceci le fera automatiquement pour vous.
Autres conseils
Les répertoires VC ++ sont la liste des emplacements de répertoire à rechercher lors de la liaison. Ce n'est pas une liste de bibliothèques à lier.
Vous devez ajouter le fichier lib au champ Dépendances supplémentaires des paramètres de l'éditeur de liens de projet .
Pour créer un lien avec une bibliothèque, vous pouvez soit:
- Répertoriez-le dans Projet- > Propriétés ...- > Linker, Input- > Dépendances supplémentaires (Les répertoires VC ++ vous permettent uniquement d’utiliser le nom .lib plutôt que le chemin complet),
- Ajoutez le projet de bibliothèque à votre application. solution (Sur la solution, cliquez avec le bouton droit de la souris sur > 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 façon de procéder si vous éditez les deux projets, car VC ++ reconstruira la bibliothèque si elle a été modifiée avant la construction de votre application.
-
Si vous êtes certain de n'utiliser que VC ++,
#pragma comment(lib,"C:\\path\\to\\library.lib")`
(Merci @Nils)
NB: Il semble très étrange que votre dossier de solution de bibliothèque se trouve dans un répertoire 'include': ils sont vraiment destinés aux fichiers * .h (ou à d’autres fichiers #include
d).
À partir de la ligne de commande:
cl / EHsc {objfiles} + / link / LIBPATH: LibraryFolder Library.lib
Où {objfiles} + signifie un ou plusieurs fichiers objet ou cpp.
VC ne lie pas simplement la bibliothèque si vous incluez le fichier d'en-tête.
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 toutes les rechercher à chaque fois que vous liez votre programme, il devrait parcourir des centaines de mégaoctets de données.
Cela prendrait pas mal 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, vous ajoutez la ligne suivante quelque part dans votre code source (l'en-tête de la bibliothèque peut être un bon endroit).
#pragma comment(lib,"c:\\path_to_library\\libname.lib")
Ce n’est pas une plate-forme indépendante, mais le moyen le plus pratique d’associer automatiquement une bibliothèque à un projet utilisant MSVC.
Une autre méthode 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 bibliothèque aux configurations de publication et de débogage.