Visual Studio удаляет общий файл .pch и вопросы о пользовательских этапах сборки - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь использовать общий файл .pch, который скомпилирован в одном проекте и используется в других.

Однако файл .pch удаляется, если имя файла .pdb проекта PCH отличается от .pdb имена файлов других проектов.

Эта страница не отвечает на вопрос: https://devblogs.microsoft.com/cppblog/shared-pch-usage-sample-in-visual-studio/

Я не хочу использовать одно и то же имя для всех PDB.

Вопросы:

1) Почему файл .pch удаляется при старте компиляции других проектов, что приводит к ошибке C1083 (.pch не найден), если имена PDB не совпадают , не как на этой странице?

2) Я копирую файлы pch.pdb и pch.idb с помощью команды COPY, есть ли команда RENAME или что-то в этом роде, если скопированный pch.pdb должен быть назван так же, как и зависимый PDB проекта? И где я могу найти полный список команды Custom Build Step?

3) Мне непонятна цель «Дополнительные зависимости» и «Выходы» в Custom Build Step. Могу ли я ввести имя файла .pch в список зависимостей, чтобы оно не было удалено? Должен ли список вывода содержать имя PDB зависимого проекта, или pch.pdb, или и то, и другое?

Ответы [ 2 ]

1 голос
/ 11 мая 2020

По какой-то причине (я сделал это или нет) сгенерированный компилятором файл .pdb был не $ (PlatformToolsetVersion) .pdb, а $ (ProjectName) .pdb. Таким образом, в моем случае скопированный в другие папки проекта общий файл .pdb был pch.pdb, в то время как другие проекты ожидали других имен. И это запускало задачу DELETE в Microsoft.CppCommon.targets, («Удалите файл pch, если файл pdb был удален.»). Вместо изменения выходного имени .pdb я просто посмотрел на команду XCOPY и заставил ее изменить скопированное имя файла на ожидаемое в конкретном проекте c (на самом деле тогда я просто добавил настраиваемую цель с переименованием задачи копирования прямо в проект файл вместо использования CustomBuildStep, вызывающего команду ОС xcopy, поскольку теперь я узнал больше о MSBuild).

Затем я также изменил сгенерированный компоновщиком выходной файл .pdb, просто добавив суффикс «Связанный» к имени, поэтому нет конфликтов между PDB компилятора и компоновщика. Не уверен, что менять настройки по умолчанию без веской причины - хорошая идея.

Думаю, лучше просто изменить выходной PDB компилятора на $ (PlatformToolsetVersion) .pdb, чтобы все проекты использовали одинаковые name.

Это был первый раз, когда я изучал MSBuild и расширенные настройки проекта, теперь кажется очевидным, что проекту, использующему общий .pdb, требуется какое-то знакомое имя .pdb, а не случайный pch. pdb

Вот моя настраиваемая цель, импортированная в файлы проекта, копирующая общий .pdb, только если он был перестроен (.idb в моем случае не создается):

<Target Name="CopyFreshPchPdb" BeforeTargets="ClCompile" 
    Inputs="$(PchDir)\pch.pdb"
    Outputs="$(IntDir)\$(ProjectName).pdb">
    <Message  Importance="High" Text="Copying shared pch.pdb" />
    <Copy
        SourceFiles="$(PchDir)\pch.pdb"
        DestinationFiles="$(IntDir)\$(ProjectName).pdb">
    </Copy>
</Target>
1 голос
/ 08 мая 2020

Использовали ли вы образец кода по ссылке github .

Если да, вам следует загрузить и затем использовать этот образец, а если вы создаете свой собственный проект, вы должны проверить свои проекты осторожно.

Заимствуя этот учебник для вашего проекта, я думаю, вам нужно обратить внимание на то, есть ли у вас какие-либо дополнительные настраиваемые цели в вашем файле xxx.vcxproj, чтобы удалить файл PCH . Поэтому нужно внимательно проверять каждый файл xxx.vcxproj. В vs некоторые файлы не будут удалены из-за разных имен файлов .pdb проекта PCH и других проектов, поэтому проверьте, есть ли у вас собственные дополнительные операции.

1) Почему файл .pch удаляется при запуске компиляции других проектов, что приводит к ошибке C1083 (.pch не найден), если имена PDB не совпадают, не как на этой странице?

Прежде всего , убедитесь, что в ваших проектах нет другой возможности удалить файл PCH.

Проект PCH должен создать файл PCH, а два других проекта должны использовать этот файл . И каждый раз, когда вы создаете два проекта (обратитесь к проекту PCH), всегда выполняйте сборку проекта PCH, а затем строите два проекта. Таким образом, PCH всегда создается и позже может использоваться в двух проектах.

Основываясь на , вы должны убедиться, что все три проекта создают и используют один и тот же адрес для файла.

Проект SharedPCH

enter image description here

ConsoleApplication1

enter image description here

ConsoleApplication2

enter image description here

В примере кода PCH файл существует под SharedPchSample\Outputs\Intermediate\Shared\Win32\Debug.

2) Я копирую файлы pch.pdb и pch.idb с помощью команды COPY, есть ли команда RENAME или что-то в этом роде, если скопированный pch.pdb должен быть назван прямо как PDB зависимого проекта? И где я могу найти полный список команд Custom Build Step?

Custom Build Step находится под каждым проектом -> Properties -> Custom Build Step - > Command Line, и тогда вы сможете его найти. Этот настраиваемый шаг - просто команда CMD. И вы можете выполнить CMD, чтобы выполнить дополнительную операцию.

Помимо , я думаю, вы хотите, чтобы эти xxx.pdb и xxx.idb совпадали с именем проекта по порядку отличать guish одно от другого. Вы можете щелкнуть правой кнопкой мыши по каждому проекту -> Properties -> C/C++ -> Output Files -> Program Database File Name -> изменить его и использовать $(IntDir)$(ProjectName).pdb. Подробнее о Custom Build Steps вы можете обратиться к по этой ссылке .

Мне непонятна цель «Дополнительные зависимости» и «Выводы» на этапе пользовательской сборки. Могу ли я ввести имя файла .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, поэтому эти файлы зависимого проекта не будут найдены в основном проекте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...