Вчера я просмотрел проекты нашей компании и обновил их, чтобы исправить ошибку (AFAIK) в том, как мы их настроили.
Проблема заключалась в том, что под страницами свойств для проектов, под Configuration Properties -> C/C++ -> Output Files
, мы установили Program Database File Name
в $(OutDir)$(TargetName).pdb
, так же значение, которое мы установили Configuration Properties -> Linker -> Debugging -> Generate Program Database File
,
Насколько я понимаю, первое свойство устанавливает местоположение файла pdb, который содержит символы для объектных файлов, созданных во время компиляции исходного кода, а второе задает местоположение файла pdb, который содержит символы для сгенерированной DLL. Это верно?
Согласно этому предположению, чтобы предотвратить их конфликт (я предполагаю, что это нежелательно), я устанавливаю первое свойство в $(IntDir)$(TargetName).pdb
, но это сломало получившийся файл pdb (то есть отладчик не распознает его как файл pdb DLL, и сотрудник запустил на нем инструмент, а подпись не совпадает с сигнатурой, содержащейся в двоичном файле).
Странно то, что используя значение $(IntDir)$(TargetName)2.pdb
(обратите внимание, что суффикс ‘2’) исправляет проблему. Я не понимаю, почему имя промежуточного файла будет иметь значение?
Обратите внимание, что Configuration Properties -> C/C++ -> General -> Debug Information Format
установлен в Program Database (/Zi)
Я бы сказал, что вы правильно поняли: компилятор создает объектные файлы. В то время DLL еще не готова, поэтому, что бы ни содержал этот файл PDB, это не поможет при отладке.
После того, как компоновщик обработал выходные данные компилятора, DLL существует. В то время, PDB имеет смысл для отладки. Таким образом, соответствующий файл для целей отладки находится в Linker -> Debugging -> Generate Program Database File
,
Как упомянул @HansPassant в комментариях, настройки компилятора не следует трогать. Жаль, что это уже случилось. В консольном приложении Visual Studio 2013 или 2015 C ++ значение по умолчанию для C/C++ -> Output Files
является $(IntDir)vc$(PlatformToolsetVersion).pdb
итоговое название Debug\vc120.pdb
или же Debug\vc140.pdb
,
ИМХО, изменение выходного файла компилятора не должно иметь значения, если имя не конфликтует с настройкой компоновщика. Это именно то, что случилось с вами: имя компилятора $(IntDir)$(TargetName).pdb
(относительный путь) разрешается в тот же файл, что и имя компоновщика $(OutDir)$(TargetName).pdb
(абсолютный путь). В этом случае может случиться так, что компоновщик не сможет записать в файл, потому что он все еще используется компилятором или другими странными вещами.
Других решений пока нет …