Правильное создание файлов PDB для собственной библиотеки DLL с использованием Visual Studio 2013

Вчера я просмотрел проекты нашей компании и обновил их, чтобы исправить ошибку (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)

2

Решение

Я бы сказал, что вы правильно поняли: компилятор создает объектные файлы. В то время 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 (абсолютный путь). В этом случае может случиться так, что компоновщик не сможет записать в файл, потому что он все еще используется компилятором или другими странными вещами.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]