Проблемы с совместным использованием предварительно скомпилированного заголовка

#c #visual-studio #precompiled-headers

#c #visual-studio #предварительно скомпилированные заголовки

Вопрос:

Я знаю, что об этом спрашивали сто раз, но, похоже, я не могу заставить свои проекты работать. У меня есть два проекта, оба являются статическими библиотеками (.lib). Один проект — это мой проект Core Engine с предварительно скомпилированным заголовком, другой мой проект — это проект Input Manager, который использует мой Core Engine, поэтому моя первоначальная проблема заключается в том, что если я не настрою свой проект Input Manager с предварительно скомпилированным заголовком, все файлы Core Engine содержат ошибки компилятора из-за отсутствия включений. Итак, я пытался настроить свой диспетчер ввода на использование предварительно скомпилированного заголовка из проекта Core Engine, и я расскажу, как я его настроил.

Мой основной проект — это настройка того, как вы обычно настраиваете предварительно скомпилированный заголовок, и все это работает. В самом проекте Core Engine

Параметры PCH проекта Core Engine

Мой PrecompiledHeader.cpp файл использует эти настройки.

PrecompiledHeader.cpp настройки

С другой стороны, я думаю, что мой менеджер ввода доставляет мне проблемы, и я перепробовал целую кучу разных настроек, и у меня ничего не получилось. Вот как настроен мой проект Input Manager.

введите описание изображения здесь

Таким образом, он указывает на файл .pch ядра ядра. Используя некоторые ответы, которые я нашел в Интернете, я также копирую файлы .pdb и .idb ядра ядра, например.

введите описание изображения здесь

Это работает, эти два файла .pdb и .idb копируются. Я также добавил папку Core Engine в дополнительные каталоги Include, и я думаю, что это все, что мне нужно сделать, основываясь на всем, что я прочитал в Интернете, но все еще не могу заставить его работать.

В моем проекте Input Manager сейчас есть только два файла: InputManager.h и InputManager.cpp и я пробовал включать и не включать PrecompiledHeader.h в верхней части InputManager.cpp . Что бы я ни пытался, я просто получаю эту ошибку из проекта Input Manager.

 unexpected end of file while looking for precompiled header. Did you forget to add '#include "PrecompiledHeader.h"' to your source?
 

Если у кого-нибудь есть представление о том, как заставить это работать или даже лучшее решение, я весь внимание.

Спасибо!

Комментарии:

1. Я думаю, вы должны использовать другой предварительно скомпилированный заголовок для каждого проекта. Кроме того, как вы его включили?

2. Из того, что я прочитал в Интернете, совместное использование предварительно скомпилированного заголовка в разных проектах выполнимо, просто кажется сложным. Я попытался просто добавить PrecompiledHeader.cpp и предварительно скомпилированный заголовок. h также относится к моему проекту Input Manager и просто делает его собственным .pch для моего проекта Input Manager, но с этим тоже не повезло. Когда я говорю, что включил предварительно скомпилированный заголовок. h в верхней части InputManager.cpp , Я только что добавил #include «PrecompiledHeader.h» вверху

Ответ №1:

В настоящее время существует другой способ получения общих предварительно скомпилированных заголовков путем создания SharedPCH. Вы можете обратиться к блогу Microsoft для получения дополнительной информации. Вот статья.

Когда проекты ConsoleApplication ссылаются на SharedPCH, сборка автоматически свяжет статическую библиотеку SharedPCH, но также необходимо изменить несколько свойств проекта.

введите описание изображения здесь C / C Дополнительные включаемые каталоги (/ I) должны содержать общий каталог stdafx.h C / C Предварительно скомпилированный выходной файл заголовка (/ Fp) должен быть установлен в общий файл pch (созданный проектом SharedPCH) Если ваши проекты скомпилированы с использованием /Zi или /ZI (подробнее об этих переключателях см. В конце), проектам, использующим общий pch, необходимо скопировать файлы .pdb и .idb, созданные общим проектом pch, в их конкретные местоположения, чтобы конечные файлы pdb содержали символы pch. Поскольку эти свойства необходимо изменять одинаково для всех проектов, я создал файлы SharedPCH.props и CustomBuildStep.props и импортировал их в свои проекты с помощью окна инструмента Property Manager.

SharedPch.props помогает с # 1 и # 2 и импортируется во все проекты. CustomBuildStep.props помогает с # 3 и импортируется в потребляющие проекты pch, но не в производящий. Если ваши проекты используют /Z7, вам не нужен CustomBuildStep.props .

введите описание изображения здесь

В SharedPch.props я определил свойства для общих расположений файлов pch, pdb и idb:

введите описание изображения здесь

Скорректированы свойства C / C «Дополнительные включаемые каталоги» и «Предварительно скомпилированный выходной файл заголовка»:

введите описание изображения здесь

введите описание изображения здесь

В CustomBuildStep.props я определил пользовательский шаг сборки для запуска перед ClCompile target и копированием общих файлов pch .pdb и .idb, если они новее, чем файлы .pdb и .idb проекта. Обратите внимание, что здесь мы говорим о промежуточном файле pdb компилятора, а не о конечном файле, созданном компоновщиком.

Если все файлы в проекте используют один pch, это все, что нам нужно сделать, поскольку при изменении pch все остальные файлы также должны быть перекомпилированы, поэтому в конце сборки у нас будут полные файлы pdb и idb.

Если ваш проект использует более одного pch или содержит файлы, которые вообще не используют pch, вам нужно будет изменить расположение файла pdb (/ Fd) для этих файлов, чтобы оно не переопределялось общим pdb pch.

введите описание изображения здесь

Я использовал редактор свойств командной строки для определения команд. Каждая команда ‘xcopy’ должна находиться в отдельной строке:

введите описание изображения здесь