Использовали ли вы пример кода по ссылке на github.
Если это так, вам следует загрузить и затем использовать этот образец, а если вы создаете свой собственный проект, вам следует тщательно проверить свои проекты.
Заимствуя этот учебник для вашего проекта, я думаю, вам нужно обратить внимание на то, есть ли у вас какие-либо дополнительные пользовательские цели в вашем файле xxx.vcxproj
, чтобы удалить файл PCH. Поэтому вам необходимо тщательно проверять каждый файл xxx.vcxproj
. В vs не будет удаления определенных файлов из-за разных имен файлов .pdb проекта PCH и других проектов, поэтому проверьте, нет ли дополнительных собственных операций.
1) Почему файл .pch удаляется при старте компиляции других проектов, что приводит к ошибке C1083 (.pch не найден), если имена PDB не равны, не как на той странице?
Прежде всего убедитесь, что в ваших проектах нет другой возможности удалить файл PCH.
Проект PCH должен создать файл PCH, а два других проекта должны использовать такой файл. И каждый раз, когда вы создаете два проекта (ссылка на проект PCH), всегда выполняйте сборку проекта PCH, а затем стройте два проекта. Таким образом, PCH всегда создается, а затем используется в двух проектах.
Основываясь на этом, вы должны убедиться, что все три проекта создают и используют один и тот же адрес для файла.
Проект SharedPCH
![введите здесь описание изображения](https://i.stack.imgur.com/kZua7.png)
Консольное приложение1
![введите здесь описание изображения](https://i.stack.imgur.com/RU5KF.png)
Консольное приложение2
![введите здесь описание изображения](https://i.stack.imgur.com/1tM9f.png)
В примере кода файл PCH находится в папке SharedPchSample\Outputs\Intermediate\Shared\Win32\Debug
.
2) Я копирую файлы pch.pdb и pch.idb с помощью команды COPY, есть ли команда RENAME или что-то в этом роде, если скопированный pch.pdb должен называться так же, как PDB зависимого проекта? И где я могу найти полный список команд Custom Build Step?
Шаг пользовательской сборки находится в каждом проекте -->Properties
-->Custom Build Step
-->Command Line
, и затем вы можете найти его. Этот пользовательский шаг — это просто команда CMD. И вы можете выполнить CMD, чтобы выполнить дополнительную операцию.
Кроме того, я думаю, вы хотите, чтобы эти xxx.pdb
и xxx.idb
совпадали с именем проекта, чтобы отличать одно от другого. Вы можете щелкнуть правой кнопкой мыши по каждому проекту -->Properties
-->C/C++
-->Output Files
-->Program Database File Name
-->изменить его и использовать $(IntDir)$(ProjectName).pdb
. Дополнительные сведения об шагах пользовательской сборки см. в по этой ссылке.
Я не понимаю цели «Дополнительных зависимостей» и «Выходов» на этапе пользовательской сборки. Могу ли я ввести имя файла .pch в список зависимостей, чтобы он не был удален? Должен ли выходной список содержать имя PDB зависимого проекта, pch.pdb или и то, и другое?
Additional dependencies
настроен на использование содержимого файла PCH в проектах 1 и 2, что аналогично настройке адреса библиотеки эталонных классов в проекте C++. И я думаю, что это может быть излишним, и поскольку автор добавил это, это означает, что это хорошо обосновано.
И Outputs — это настраиваемый автором выходной путь, автор изменил выходной адрес проекта и запустил новый настраиваемый выходной путь и временный выходной путь.
На самом деле файл xxx.pch
и его файлы pdb
и idb
не будут скопированы в выходной путь. Таким образом, шаг пользовательской сборки заключается в копировании файлов во временный выходной путь. И если вы хотите скопировать их в окончательный выходной путь, вы также можете использовать их в файле CustomBuildStep.targets
:
<CustomBuildStep>
<Command>
if EXIST "$(SharedPdb)" xcopy /Y /F "$(SharedPdb)" "$(IntDir)"
if EXIST "$(SharedIdb)" xcopy /Y /F "$(SharedIdb)" "$(IntDir)"
if EXIST "$(SharedPdb)" xcopy /Y /F "$(SharedPdb)" "$(OutDir)"
if EXIST "$(SharedIdb)" xcopy /Y /F "$(SharedIdb)" "$(OutDir)"
</Command>
<Outputs>$(IntDir)vc$(PlatformToolsetVersion).pdb;</Outputs>
<Inputs>$(SharedPdb)</Inputs>
</CustomBuildStep>
И на самом деле один проект ссылается на другой проект, и выходные файлы упомянутого проекта автоматически копируются в основной проект. Возможно, это связано с тем, что авторский проект SharePCH не генерирует файлы pdb и idb, поэтому файлы зависимого проекта не будут найдены в основном проекте.
person
Mr Qian
schedule
08.05.2020
SharedPchSample\Outputs\Intermediate\Shared\Win32\Debug
. Структура решения изменена автором (включая выходной путь). VS не удалит этот файл по умолчанию, это бессмысленно. Поэтому, пожалуйста, проверьте свой файлxxx.vcxproj
и убедитесь, что в нем нет задачи удаления. - person Mr Qian   schedule 07.05.2020SharedPCH
предназначен для создания файла pch, а проект 1 и проект 2 - для использования файла pch. Из-за того, что проект 1 и 2 ссылаются на SharedPCH, он всегда будет создаваться первым, а затем использоваться позже. Щелчок правой кнопкой мыши по каждому проекту -->Properties
-->C/C++
-->Precompiled Headers
-->Precompiled Headers Output File
одинаковы. ПодProperties
--›Custom Build Step
можно найти. Название разработано таким образом. Этот пользовательский шаг - это просто команда CMD. И вы можете ввестиProperties
--›C/C++
--›Output Files
--›Program Database File Name
, чтобы изменить его и использовать$(IntDir)$(ProjectName).pdb
. - person Mr Qian   schedule 07.05.2020xxx.pdb
иxxx.idb
) в настраиваемый выходной файл для отладки общего проекта, и он не имеет ничего общего с операцией удаления. В конце концов, эти файлы нужны для настройки отладки. Итак, как вы упомянули, они должны содержаться, поскольку на общий проект ссылаются проекты 1 и 2. Что касается проблемы удаления, она действительно не имеет ничего общего с собой, вам нужно перепроверить свой проект, чтобы увидеть, какие изменения были сделаны или вернуться к исходному проекту. - person Mr Qian   schedule 07.05.2020pch.pdb
действительно сбивает с толку. Расширениеpdb
, так что это файл базы данных программы для отладки. У него нет расширения.pch
, поэтому он не имеет ничего общего с предварительно скомпилированными заголовками. - person MSalters   schedule 12.05.2020