#c #visual-studio #precompiled-headers
#c #visual-studio #предварительно скомпилированные заголовки
Вопрос:
Я знаю, что об этом спрашивали сто раз, но, похоже, я не могу заставить свои проекты работать. У меня есть два проекта, оба являются статическими библиотеками (.lib). Один проект — это мой проект Core Engine с предварительно скомпилированным заголовком, другой мой проект — это проект Input Manager, который использует мой Core Engine, поэтому моя первоначальная проблема заключается в том, что если я не настрою свой проект Input Manager с предварительно скомпилированным заголовком, все файлы Core Engine содержат ошибки компилятора из-за отсутствия включений. Итак, я пытался настроить свой диспетчер ввода на использование предварительно скомпилированного заголовка из проекта Core Engine, и я расскажу, как я его настроил.
Мой основной проект — это настройка того, как вы обычно настраиваете предварительно скомпилированный заголовок, и все это работает. В самом проекте Core Engine
Мой 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’ должна находиться в отдельной строке: