2013-04-30 2 views
15

Nous avons passé les points répertoriés sur MSDN WRT à cette erreur (sauf pour # 5). Trois personnes différentes sur des machines différentes rencontrent le même problème. Le PDB est créé, mais échoue quelque part au milieu.LNK1201 Visual C++ 2010 Grand projet ne pas générer de PDB

Détails:

  • 67 bibliothèques statiques
  • 4,27 GB des bibliothèques statiques
  • 1048575 octets - taille de l'APB lorsque linker ne
  • Les deux dernières méga-octets de l'APB sont nuls (zéro de
  • La génération de version réussit & produit un PDB (nous l'avons allumer, sans informations de débogage dans l'exe)
  • Sortie PDB de construction est juste au-dessous de 1 GB.

Nous avons désactivé les scanneurs de virus. Regardé avec procmon.exe et vu aucune interaction de suspicions avec la PDB lorsque l'éditeur de liens a échoué.

Related question suggère ~ 1 Go limite sur PDB - quelqu'un/moyen de confirmer cela?

MISE À JOUR & SOLUTION:

@Barry et l'équipe de chrome ont mis au point la solution. Here est le correctif du système de génération Chromium qui implémente la résolution.

Détails
L'APB utilise un système de fichiers virtuel interne: MSF. Lorsque l'éditeur de liens crée le fichier PDB, il a par défaut une taille de page de 2 Ko (apparemment non configurable). Apparemment & heureusement, quand le compilateur crée sa PDB, la taille de la page est de 4 Ko. Ce PDB du compilateur peut être hissé et utilisé comme base pour le lieur PDB.

Une meilleure solution En tant que événement pré-Link sur le projet qui est un lien de votre exe ou dll nous pouvons hisser le compilateur pour générer notre nécessaire APB initial:

cl -c "dummy_empty.cpp" /Zi /Fd"$(TargetDir)$(TargetName).pdb" 

Solution originale
Créez un projet de bibliothèque statique C++ avec un fichier cpp vide, configurez le 'Nom du fichier de base de données Porgram' pour sortir autre chose que le fichier par défaut. Utilisez certains événements de génération de projet (j'ai utilisé 'Pre-Link Event') pour copier dans la PDB précédemment créée dans l'endroit où vous attendez le Linker (voir Linker-> Generate Program Database File) pour créer sa PDB. Heureusement, l'éditeur de liens adoptera le format PDB copié et utilisera sa taille de page de 4 Ko. Cela permettra d'acheter du temps, et de l'espace permettant jusqu'à 2 Go PDB.

+0

Les constructions incrémentielles étaient connues pour causer de tels problèmes. Est-ce que cela se produit lors d'une reconstruction complète après un nettoyage? –

+0

Oui, cela se passe sur build & rebuild. Je crois que les liens incrémentaux sont désactivés, mais nous vérifions deux fois. – Zac

Répondre

6

Il existe en effet une limite maximale de 1GB pour la taille de pdb. Il ya une astuce pour étendre cela à 2GB (plus d'informations à ce sujet peut être trouvé Here). Fondamentalement, vous devez générer le fichier pdb initial vous-même à la place du compilateur.

D'autres choses que vous pourriez faire est de faire un levage actif sur votre code de modèle, car cela pourrait également affecter vos tailles de pdb.

+0

Lien vers le changeset correspondant de chrome: https://chromium.googlesource.com/experimental/external/gyp/+/9ee1e40e50f3148f691965a0829709f0d25b0412 –

0

Avez-vous essayé de réduire le nombre de générations parallèles? Un paramètre Sometwhere dans l'IDE. Sur VC9, nous avions un problème similaire et notre seule solution était de réduire le nombre de builds locaux. Serait-ce aussi un problème de mémoire? Utilisez-vous VC 10 SP1?

+0

Tout va bien, donc je ne sais pas pourquoi faire/MP compile aurait un impact. Nous sommes préoccupés par le fait que l'éditeur de liens manque de mémoire, c'est une version 32 bits (32 bits linker.exe). Nous utilisons SP1. – Zac

5

J'ai mis en place un programme de test avec 1000 fichiers cpp, chaque cpp avec une fonction, qui instancié 500 types de modèles uniques. Le lien de Link.exe a échoué lorsque le fichier PDB a atteint: 1048575 Ko.

Semble être une sorte de limite stricte à 1 Go dans le format PDB ou dans LINK.exe.

Questions connexes