Как использовать несколько предварительно скомпилированных заголовков; некоторые из библиотеки - PullRequest
0 голосов
/ 16 апреля 2019

Я не думаю, что это уникально для моих проектов, это относится к любой библиотеке C ++, которая использует предварительно скомпилированные заголовки, и к проекту, который использует библиотеку, которая имеет свои собственные предварительно скомпилированные заголовки. Просто заголовки C ++ / winRt требуют СООО времени, и вам действительно нужно их предварительно скомпилировать.

У меня есть библиотека C ++ / winRT UWP. Поскольку он использует API среды выполнения Windows, он «нуждается» в прекомпиляции этих массивных заголовочных файлов. Я называю этот файл «btwrpch.h», поскольку он содержит в основном API-интерфейсы времени выполнения Bluetooth. Библиотека сборка в порядке.

Теперь эта библиотека должна использоваться в другом проекте UWP на C ++ / winRT, который также использует среды выполнения Windows, в основном пользовательский интерфейс. В предварительно скомпилированных заголовках для этого проекта используется классический pch.h.

Для использования библиотеки в проекте имеются файлы заголовков библиотеки, включая btwrpch.h. Проект имеет собственный файл pch.h.

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

В проекте я разместил файл btwrpch.cpp и файл pch.cpp. Я настроил каждый из этих файлов cpp для генерации предварительно скомпилированных заголовков.

В параметре предварительно скомпилированного заголовка свойств проекта у меня есть два файла: pch.h; btwrpch.h и два выходных файла $ (IntDir) pch.pch; $ (IntDir) btwrpch.pch;

Все же, когда я перестраиваю проект, я получаю ошибку

fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "pch.h; btwrpch.h"' to your source?

У меня есть один исходный файл (в дополнение к файлам header.cpp) с именем app.cpp, и оба заголовка включены. Заглядывая в каталог Debug, я вижу и pch.pch, и btwrpch.pch.

Что я делаю не так?

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

1 Ответ

1 голос
/ 16 апреля 2019

Хотя вы можете иметь несколько предварительно скомпилированных заголовочных файлов на проект, вы можете иметь не более одного предварительно скомпилированного заголовка на единицу компиляции.Очевидно, вы тянете несколько предварительно скомпилированных заголовочных файлов в один модуль компиляции.Это не поддерживается.

Что я делаю не так?

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

Решение здесь простое: удалите все предварительно скомпилированные заголовочные файлы из открытого интерфейса вашей библиотеки (файл заголовка, определяющий API).Вместо этого включите все файлы заголовков, от которых зависит интерфейс библиотеки, как если бы вы вообще не использовали предварительно скомпилированные заголовки.

При использовании этой библиотеки включите файл заголовка библиотеки в модуль компиляции, используемый для создания предварительно скомпилированного заголовка(например, добавив директиву #include "mylib.h" в pch.h).После этого и интерфейс библиотеки, и все ее зависимости прекомпилируются в потребляющем проекте.

...