Question

Nous utilisons actuellement un seul outil de ligne de commande pour construire notre produit sur Windows et Linux.

Si loin ses œuvres joliment, ce qui nous permet de construire de source et avec des dépendances plus fines que ce que tout notre système de construction précédente autorisé. Cela nous achète de grandes capacités de construction supplémentaires et parallèles.

Pour décrire brièvement le processus de construction, nous obtenons l'habituel:

.cpp -- cl.exe --> .obj and .pdb
multiple .obj and .pdb -- cl.exe --> single .dll .lib .pdb
multiple .obj and .pdb -- cl.exe --> single .exe .pdb

Le compilateur msvc C / C ++ supporte de manière adéquate.

Récemment, la nécessité de construire quelques bibliothèques statiques émergé. D'après ce que nous avons recueilli, le processus de construction d'une bibliothèque statique est:

multiple .cpp -- cl.exe --> multiple .obj and a single .pdb
multiple .obj -- lib.exe --> a single .lib

Le pdb unique signifie que cl.exe ne doit être exécutée une fois pour toutes les sources de Cpp. Cette exécution unique signifie que nous ne pouvons pas paralléliser la construction de cette bibliothèque statique. Ceci est vraiment regrettable.

Nous avons étudié un peu plus loin et selon la documentation (et les options de ligne de commande disponibles):

  • cl.exe ne sait pas comment construire des bibliothèques statiques
  • lib.exe ne sait pas comment construire des fichiers .pdb

Quelqu'un sait-il un moyen de fusionner plusieurs fichiers PDB? Sommes-nous condamnés à être lent construit pour les bibliothèques statiques? Comment faire des outils tels que le travail IncrediBuild autour de cette question?

Était-ce utile?

La solution

Je ne l'ai pas fait C ++ depuis longtemps, mais de ce article .

Autres conseils

Pas besoin de fusionner des fichiers PDB.

Compiler les fichiers sources avec / Z7 pour éviter de créer une PDB pendant les étapes de cl.exe.

Utilisez LIB.EXE pour créer statiques avec des informations d'abord des bibliothèques de débogage intégré. Utilisez Link.exe au lieu de CL.EXE pour lier, l'utilisation / APB pour spécifier où les informations de débogage passe.

Si vous déboguez un processus avec un EXE et un ou plusieurs DLL, nourrir votre débogueur une PDB pour chaque image (EXE ou DLL).

Fusionner les fichiers PDB sont possibles, mais ne peut se faire par cl.exe et link.exe. Je ne sais pas d'outils de standlone pour fusionner des fichiers PDB.

Vous pouvez utiliser l'option / APB pour linker (j'ai vérifié VC2005) pour indiquer le nom du fichier pdb autre.

Microsoft suggère d'inclure également les fichiers PDB (chaque obj a un fichier PDB correspondant) avec fichier .LIB.

Vous ne pouvez pas archiver les fichiers PDB dans le fichier .LIB, je l'ai essayé avec VC2003, a échoué.

compilez avec / Z7 peut éviter PDB pour .LIB, mais les fichiers objet sont grandes, à moins que la bande link.exe les informations de débogage. Si vous n'avez pas / option de débogage de liaison, puis votre exe / dll ne peut pas être débogué.

Compiler (cl.exe) écrire toujours fichier vcXX.pdb sauf si vous utilisez l'option / Fd pour spécifier un autre nom. Même lorsque vous utilisez cl.exe pour produire un fichier exécutable « directement », il va produire un fichier vc80.pdb puis le link.exe produira le nom du fichier pdb même que l'exécutable.

cl / Zi test.c

cl.exe -> vc80.pdb link.exe lu vc80.pdb (le nom est intégré dans test.obj fichier) -> test.pdb

A chaque fois cl / Zi / c compiler un fichier, il va essayer de modifier le fichier vcXX.pdb existant au lieu de le remplacer.

Je suis le conslusion ci-dessus par le jeu avec le compilateur, encore et encore, puis le résultat de capture procexp de Sysinternals et l'analyser. Espérons que cela aide.

Sauf si vous voulez redistribute les bibliothèques statiques avec des informations de débogage, vous n'avez pas réellement besoin de fusionner les fichiers PDB (ou utiliser /Z7 pour intégrer les informations de débogage).

@zhaorufei-dessus, lors de l'utilisation /Zi, chaque fichier objet contient une référence à son fichier PDB, que l'éditeur de liens utilise ensuite.

Il suffit d'utiliser /Fd pour donner à chaque objet un fichier PDB unique:

> cl -c foo.cpp -Fo:target/foo.obj -Fd:target/foo.pdb -Zi
> cl -c bar.cpp -Fo:target/bar.obj -Fd:target/bar.pdb -Zi

> strings target/foo.obj | grep pdb
D:\Dev\sample\target\foo.pdb
> strings target/bar.obj | grep pdb
D:\Dev\sample\target\bar.pdb

Cela a aussi l'avantage que cela fonctionne autour des questions d'accès simultané aux fichiers PDB partagés mentionnés ici , de sorte que vous pouvez paralléliser l'étape de la compilation comme vous voulez.

Lien / archive les fichiers objet comme d'habitude. VC ++ intègre déjà différents types d'informations dans les fichiers d'objet pour les transmettre à l'éditeur de liens, comme le paramètre de liaison d'exécution et les bibliothèques dépendance - le chemin du fichier PDB est pas différent. Création d'une bibliothèque statique des objets ne supprime pas les références:

> lib -out:target/all.lib target/foo.obj target/bar.obj
> strings target/all.lib | grep pdb
D:\Dev\sample\target\bar.pdb
D:\Dev\sample\target\foo.pdb

En liant cette bibliothèque à un fichier exécutable ou DLL, l'éditeur de liens tire toujours dans les informations de débogage des PDB fait référence et il ajoute au fichier PDB final.

La seule réserve que je vois est que le chemin est toujours absolu, donc cela ne fonctionne pas si vous déplacez les fichiers autour localement ou à une autre machine avant de lier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top