LNK1201 Visual С++ 2010 Большой проект, не создающий PDB

Мы просмотрели пункты, перечисленные в MSDN WRT для этой ошибки (кроме # 5). Похожая проблема возникает у трех разных людей на разных машинах. PDB создается, но с ошибкой находится где-то посередине.

Подробнее:

  • 67 статических библиотек
  • 4.27 ГБ статических библиотек
  • 1048575 bytes - размер PDB при сбое компоновщика
  • Последняя пара мегабайт PDB равна нулю (ноль)
  • Сборка сборки завершается успешно и создает PDB (мы включаем его, без информации отладки в exe)
  • Релиз сборки PDB составляет чуть менее 1 ГБ.

У нас отключены антивирусные сканеры. Наблюдался с procmon.exe и не видел никаких подозрений в взаимодействии с PDB при неудаче компоновщика.

Связанный с этим вопрос предполагает ограничение ~ 1 ГБ на PDB - кто-нибудь/способ подтвердить это?

ОБНОВЛЕНИЕ И РЕШЕНИЕ:

@Barry и команда хром придумали решение. Здесь - это исправление для системы сборки Chromium, которая реализует разрешение.

Подробнее
PDB использует внутреннюю виртуальную файловую систему: MSF. Когда компоновщик создает файл PDB, он по умолчанию использует (по-видимому, неконфигурируемый) размер страницы 2 КБ. По-видимому, и, к счастью, когда компилятор создает свой PDB, он по умолчанию задает размер страницы 4 кБ. Этот PDB компилятора можно поднять и использовать в качестве базы для PDB компоновщика.

Лучшее решение Как событие Pre-Link в проекте, который связывает ваш exe или dll, мы можем поднять компилятор для генерации нашего необходимого начального PDB:

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

Исходное решение
Создайте проект статической библиотеки С++ с пустым файлом cpp, настройте "Имя файла базы данных Porgram" для вывода чего-либо, кроме значения по умолчанию. Используйте некоторые события для создания проекта (я использовал "Событие предварительной привязки" ), чтобы скопировать в ранее созданный PDB туда, где вы ожидаете от компоновщика (см. Linker- > Generate Program Database File), чтобы создать его PDB. К счастью, компоновщик примет скопированный в PDB и использует его размер страницы 4 кБ. Это купит некоторое время и некоторое пространство, позволяющее до 2 ГБ PDB.

Ответы

Ответ 1

Действительно, максимальный предел 1GB для размера pdb. Существует несколько трюков, чтобы расширить это до 2GB (более подробную информацию об этом можно найти здесь). В основном вам нужно сгенерировать исходный файл pdb самостоятельно, а не компилятор.

Другие вещи, которые вы могли бы сделать, это сделать некоторые активные подъемы вашего кода шаблона, так как это также может повлиять на ваши размеры pdb.

Ответ 2

Я собрал тестовую программу с 1000 cpp файлами, каждая cpp с одной функцией, которая создала 500 уникальных типов шаблонов.

Ошибка Link.exe при достижении файла PDB: 1048575 КБ.

Появляется какой-то жесткий предел в 1 ГБ в формате PDB или в LINK.exe.

Ответ 3

Вы пытались уменьшить количество параллельных сборок. Настройка в среде IDE. На VC9 у нас была аналогичная проблема, и единственным решением было сократить количество локальных сборок. Может ли это быть проблемой памяти? Вы используете VC 10 SP1?