En ce moment, j'essaie de créer mon premier "vrai" projet en C ++ à l'aide de Visual Studio 2019. Je dois inclure une bibliothèque tierce en tant que dépendance. Les instructions sur la page d'accueil du projet recommandent simplement d'inclure tous les fichiers source / en-tête directement dans le projet. Je crois comprendre que c'est une mauvaise pratique, car le résultat final aurait l'air assez moche dans n'importe quel VCS.
Heureusement, l'auteur de la bibliothèque a également fourni des scripts de construction qui appellent cl, lib et lient avec les arguments appropriés et produisent le très convoité foo.lib. J'ai ajouté ce fichier aux dépendances dans les options de l'éditeur de liens et après quelques discussions avec les options du compilateur / éditeur de liens, je l'ai finalement fait fonctionner.
À ma grande détresse, j'ai réalisé que j'avais fait toutes ces manipulations dans la configuration de Release, ce qui m'a empêché d'utiliser le débogueur. J'ai ensuite construit la bibliothèque avec / MDd, corrigé certaines options du compilateur ... et j'ai eu une erreur de compilation bizarre dans vcruntime.h ( erreur fatale C1189: #error: _HAS_CXX17 et _HAS_CXX20 doivent tous deux être définis, et _HAS_CXX20 doit impliquent _HAS_CXX17 ).
À ce stade, je savais que je faisais quelque chose de terriblement mal, car inclure une bibliothèque simple ne devrait pas nécessiter autant de réglages manuels des boutons. Quelle est la bonne manière canonique d'inclure des dépendances tierces dans Visual Studio (et C ++ en général)? En supposant que la dépendance n'est pas disponible sur Nuget, vcpkg ou autre.
3 Réponses :
D'après ce que j'ai compris de ce que vous avez fait, c'était sous Windows. Tout d'abord, je vous recommande d'essayer une distribution Linux. Dans Windows, il est possible d'exécuter des fichiers lib, mais ce n'est pas facile. Ce serait utile si vous pouviez m'envoyer un lien vers la bibliothèque que vous utilisez.
Je préférerais ne pas passer à Linux car j'ai l'intention d'utiliser le projet sur certains fichiers d'un jeu vidéo. En outre, je souhaite également acquérir une bonne compréhension de la gestion des dépendances en C ++. La bibliothèque est github.com/Genivia/RE-flex .
L'approche habituelle est de simplement coller ces sources dans leur propre répertoire et leur propre projet Visual Studio (pas une solution). Cela peut toujours créer un fichier foo.lib. Vous n'aurez pas besoin de beaucoup d'options pour cela.
Ensuite, vous dites simplement à Visual Studio que votre propre projet dépend de cet autre projet, et il liera alors foo.LIB pour vous.
Cela dit, il semble que vous essayez de construire vos deux projets avec des paramètres différents pour la version C ++. VS2019 a un bon support pour C ++ 17 et un support expérimental pour C ++ 20, vous pouvez donc choisir. Mais vous devez choisir de manière cohérente pour tous vos projets.
Dans les solutions plus grandes, vous pouvez utiliser un fichier .vsprops pour cela, qui est comme un #include pour les fichiers de projet. Un peu exagéré quand vous avez deux projets, une bouée de sauvetage quand vous en avez 150.
Il y a en effet deux projets dans ma solution, mais l'un dépend de l'autre, et je construis la dépendance, donc un seul projet est pertinent. J'ai en effet reçu des messages d'erreur étranges avant quand j'ai accidentellement compilé la bibliothèque sans C ++ 17, mais maintenant le paramètre "Version standard" est réglé sur C ++ 17 sur toutes les configurations. Je n'ai vu C ++ 20 mentionné nulle part sauf ce putain de message d'erreur.
La façon dont vous incluez des bibliothèques tierces varie un peu, parfois les bibliothèques tierces ont une installation et s'installent comme sous Composants communs parfois vous devez le faire manuellement.
E.g. YourSolution/3rdParty/foo/include
YourSolution/3rdParty/foo/lib
YourSolution/3rdParty/foo/lib/release
YourSolution/3rdParty/foo/lib/debug
Parfois les bibliothèques ont des noms différents, alors ils peuvent être dans le même dossier.
Une fois que vous avez cette structure, allez dans les propriétés de votre projet C / C ++ et ajoutez l'inclusion sous les répertoires d'inclusion supplémentaires assurez-vous que vous avez la configuration "Toutes les configurations" ici . Ensuite, allez dans Propriétés du projet / Linker / Input et la dépendance pour la configuration de débogage et pour la configuration de la version - car il s'agit généralement de bibliothèques différentes par configuration. par exemple. release / foo.lib et debug / foo.lib (foo.lib foo-d.lib ou quel que soit leur nom).
Utilisez les macros pour vous assurer d'obtenir les bons emplacements afin qu'ils soient relatifs à votre solution et projet. Il n'est pas bon d'avoir des chemins absolus. Par exemple. $(SolutionDir)3rdparty\foo\include
Clause de non-responsabilité: Je ne suis pas sûr que ce soit la manière "optimale" de le faire mais c'est ainsi que je le fais. p>
C'est presque exactement ce que j'ai fait, créé un répertoire tiers avec les sous-répertoires include et lib et tout y mettre. Ma préoccupation est que vous devez compiler la bibliothèque manuellement au préalable et vous assurer que tous les paramètres correspondent. Ça fait un peu bizarre quand toutes les autres langues ont une solution simple de gestion des dépendances. Cela dit, C ++ signifie travailler au niveau le plus bas, alors peut-être que cela ne s'applique pas ici.
oui la compilation de bibliothèques et s'assurer qu'elle a le même thread etc est un peu un PITA
"VCS" = référentiel de code tel que Git ou SVN?
@MSalters, oui, je voulais dire Git.