Я только что столкнулся с этой ошибкой в VS2012. Это определенно вызвано ошибкой в Visual Studio, которая проявляется в ситуациях, когда локальный файл PDB основного проекта имеет то же имя, что и конечный файл PDB для всего исполняемого файла (даже если они находятся в разных каталогах!)
Рассмотрим этот пример.
Решение состоит из трех проектов: main
, a
и b
. main
является проектом верхнего уровня для исполняемого файла, в то время как a
и b
являются библиотеками, связанными с main
.
Во всех трех проектах $(IntDir)
переменная установлена на $(SolutionDir)\$(Configuration)\$(ProjectName)\
. Это означает, что проект main
выводит свои промежуточные файлы в Debug\main\
, проект a
- в Debug\a\
и т. Д.
В настройках C/C++ -> Output Files
все три проекта имеют значение Program Database File Name
, установленное на $(IntDir)$(TargetName).pdb
. Это означает, что проект main
создает свой локальный файл PDB как Debug\main\main.pdb
, проект b
как Debug\b\b.pdb
и т. Д.
Наконец, в Linker -> Debugging
настройках проекта main
значение Generate Program Database File
установлено на $(OutDir)$(TargetName).pdb
. Это означает, что глобальный файл PDB для всего исполняемого файла будет сгенерирован как Debug\main.pdb
.
Обратите внимание, что в этой настройке каждый файл PDB генерируется в отдельном каталоге.
В этой настройке вы получите Отладочная информация не найдена или не соответствует ошибке , если вы попытаетесь запустить программу под отладчиком. И если вы посмотрите на файл Debug\main.pdb
(который будет существовать), вы заметите, что он точно такой же, как файл Debug\main\main.pdb
! То есть каким-то образом локальная PDB для main
смогла перезаписать то, что должно было быть глобальной PDB для конечного исполняемого файла. То есть отладчик вправе жаловаться, что файл PDB «неправильный». Это действительно неправильно.
Опять же, в приведенной выше настройке конечная глобальная PDB каким-то образом перезаписывается локальной PDB верхнего проекта. Я не знаю, почему это происходит. Кажется, это ошибка. (Обратите внимание, что, хотя эти файлы PDB имеют одно и то же имя, они создаются в разных каталогах, то есть они не должны конфликтовать.)
Обходной путь, решающий эту проблему, - присвоить локальной PDB проекта main
другое имя. Например, просто перейдите к C/C++ -> Output Files
для проекта main
и измените значение Program Database File Name
на $(IntDir)$(TargetName)_local.pdb
(или на $(IntDir)12345.pdb
, если хотите). Это устранит конфликт и решит проблему.