Quelles sont les implications de l'utilisation de /Zi vs /Z7 pour Visual Studio C++ projets?
Fond
Il y a plusieurs différents les indicateurs de débogage vous pouvez utiliser avec Visual Studio C++ compilateur. Ils sont:
- (aucun)
- Créer aucune information de débogage
- Plus rapide temps de compilation
- /Z7
- Produire toute la symbolique des informations de débogage dans le .obj fichiers à l'aide de format CodeView
- /Zi
- Produire toute la symbolique des informations de débogage dans un .fichier pdb de la cible à l'aide du Programme de format de Base de données.
- Permet la prise en charge pour un minimum de reconstruit (/Gm) qui peuvent réduire le temps nécessaire pour la recompilation.
- /ZI
- Produire des informations de débogage comme /Zi, sauf avec le soutien de Modifier et Continuer
Questions
-
L' /Gm drapeau est incompatible avec la /MP drapeau pour Plusieurs Processus s'appuie (Visual Studio 2005/2008)
-
Si vous souhaitez activer minimale reconstruit, puis de la /Zi du pavillon est nécessaire au cours de la /Z7 drapeau.
-
Si vous allez utiliser le commutateur /MP, il n'y a apparemment pas de différence entre /Z7 et /Zi la recherche sur le site MSDN. Cependant, la SCons documentation indique que vous devez utiliser /Z7 à l'appui des constructions parallèles.
Questions
-
Quelles sont les implications de l'utilisation de /Zi vs /Z7 dans un Visual Studio C++ projet?
-
Existe-il d'autres pros ou les inconvénients de ces deux options que j'ai manqué?
-
Plus précisément, quel est l'avantage d'un seul Programme format de Base de données (APB) fichier de la cible vs plusieurs CodeView format (.obj) des fichiers pour chaque source?
Références
MDSN /Z7, /Zi, /ZI (Informations de Débogage Format)
MSDN /MP (Build avec Plusieurs Processus)
SCons Construction des Variables CCPDBFLAG
Vous devez vous connecter pour publier un commentaire.
Codeview est un beaucoup plus vieux format de débogage qui a été introduit avec Microsoft la vieille débogueur indépendant de retour dans le "Compilateur Microsoft C" journées du le milieu des années 1980. Il prend plus de place sur le disque et il faut plus de temps pour le débogueur à l'analyse, et c'est une grande douleur lors de la liaison. Nous avons généré à partir de notre compilateur à l'époque où je travaillais sur le CodeWarrior pour Windows en 1998-2000.
Le seul avantage, c'est que Codeview est un format documenté, et d'autres outils peuvent souvent traiter quand ils ne pouvaient pas traiter avec APB-format de débogage de bases de données. Aussi, si vous êtes la construction de plusieurs fichiers à la fois, il n'y a aucun conflit d'écrire dans la base de données de débogage pour le projet. Cependant, pour la plupart des utilisations de ces jours, en utilisant le format PDB est une grande victoire, à la fois dans le temps et surtout dans le débogueur temps de démarrage.
Un avantage de la vieille C7 format est qu'il est tout-en-un, stockées dans le fichier EXE, au lieu de se séparer de l'APB et EXE. Cela signifie que vous ne pouvez jamais avoir une incompatibilité. Le VS dev outils assurez-vous que l'APB correspond à son EXE avant de l'utiliser, mais il est certainement plus simple d'avoir un seul fichier EXE avec tout ce dont vous avez besoin.
Ce qui ajoute de nouveaux problèmes, d'avoir besoin d'être en mesure de dépouiller les informations de débogage lorsque vous relâchez le bouton, et le géant de fichier EXE, pour ne pas mentionner l'ancien format et le manque de soutien pour les autres fonctionnalités modernes comme minrebuild, mais il peut encore être utile lorsque vous essayez de garder les choses aussi simples que possible. Un de ces fichiers est plus facile que de les deux.
Pas que j'utilise jamais C7 format, je suis juste mettre cela comme un avantage possible, puisque vous le demandez.
D'ailleurs, c'est comment GCC fait des choses sur quelques plateformes que j'utilise. DWARF2 format enterré dans la sortie ELFE. Unix gens pensent qu'ils sont tellement hilarant. 🙂
BTW le PDB format peut être analysée à l'aide de la DIA SDK.
Il y a encore un inconvénient pour /Z7:
Il n'est pas compatible avec la liaison incrémentielle, qui peut seule être une raison pour l'éviter.
Lien: http://msdn.microsoft.com/en-us/library/4khtbfyf%28v=vs.100%29.aspx
Par la route: même si Microsoft indique un lien complet (au lieu de différentiel) est effectuée lors de la "Un objet qui a été compilé avec le /Yu /Z7 option est modifiée.", il semble que ce n'est vrai que pour les bibliothèques statiques construire avec /Z7, pas pour les fichiers objets.
Un autre inconvénient de /Z7 est la grande taille des fichiers objets. Cela a déjà été mentionné ici, mais cela peut dégénérer jusqu'au point où l'éditeur de liens n'est pas en mesure de lier le fichier exécutable, car il se décompose de la limite de taille de l'éditeur de liens ou le format PE (il vous donne de l'éditeur de liens d'erreur LNK1248). Il semble Visual Studio ou le format PE a une limite de 2 GO (également sur les machines x64). Lors de la construction d'une version de débogage, vous pouvez courir dans cette limite. Il apparaît que ce n'est pas seulement une incidence sur la taille finale du fichier exécutable compilé, mais aussi des données temporaires. Seulement Microsoft sait à propos de l'éditeur de liens internes, mais nous nous sommes heurtés à ce problème ici (même si l'exécutable a bien sûr pas 2gigs grand, même en debug). Le problème miraculeusement à s'en alla et ne revint jamais lorsque nous sommes passés du projet /ZI.
/Z7
conserve les informations de débogage dans le .les fichiers obj dans CodeView format et permet à l'éditeur de liens extraire dans un .apb alors que/Zi
consolide dans une commune .fichier pdb de synchronisation communique avec mspdbsrv.exe lors de la compilation déjà.Donc
/Z7
signifie plus d'e /s de fichiers, l'espace disque utilisé et plus de travail pour l'éditeur de liens car il ya beaucoup de dupliquer les informations de débogage dans ces fichiers obj. Mais cela signifie également que chaque compilation est indépendant et peut donc, en fait, toujours plus vite que/Zi
avec assez de parallélisation.Maintenant qu'ils l'ont amélioré la
/Zi
situation que par la réduction de communication inter-processus avec mspdbsrv.exe: https://docs.microsoft.com/en-us/cpp/build/reference/zfUn autre cas d'utilisation de
/Z7
est pour "autonome" (mais en plus grand) les bibliothèques statiques qui ne nécessitent pas d'expédition séparée.pdb
si vous voulez. Qui empêche également la fâcheuse questions découlant de l'horrible défautvcxxx.pdb
nom cl utilise aussi longtemps que vous n'avez pas de fixer avec un bon https://docs.microsoft.com/en-us/cpp/build/reference/fd-program-database-file-name, qui la plupart des gens oublient./ZI
est comme/Zi
mais ajoute d'autres données, etc. pour faire de l'Édition et de la fonction Continuer le travail.