Как создать .pch для большого количества заголовков?

Мой код все время использует libcxx, sdl и некоторые другие библиотеки. Как я могу сгенерировать .pch, учитывая, что каждый заголовок может включать некоторые другие заголовки (даже со сложными условиями, такими как #ifdef #include #endif. Вот почему трудно понять список необходимых заголовочных файлов. Должен ли я использовать только все файлы заголовков, найденные в что папки .pch создавать? Как насчет использования такой производительности .pch в таком случае?

ОБНОВЛЕНИЕ: если это имеет значение, я собираюсь использовать его с Clang (не GCC) и быть более конкретным через Clang C API.
UPDATE2:

я создал pch для одного заголовочного файла:

MBA-Anton:pch asmirnov$ clang++ -x c++-header header.h -emit-pch -o header.pch
MBA-Anton:pch asmirnov$ clang++ -include-pch header.pch source.cpp -o source -x c++

но я не смог сгенерировать pch для нескольких файлов:

MBA-Anton:pch asmirnov$ clang++ -x c++-header header.h header2.h -emit-pch -o headers.pch
clang: error: cannot specify -o when generating multiple output files

6

Решение

НКУ Компилятор работает хорошо только с один включенный предварительно скомпилированный заголовок, как объяснено в этом ответе. Поэтому, если вы хотите использовать PCH в GCC, вам понадобится один заголовочный файл для всех модулей перевода ваших приложений (и каждый из них должен начинаться именно с этого не замужем #include директива)

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

Будущие версии (пост C ++ 14) стандарта C ++ может определять механизм модуля. Смотрите, например n4047 предложение.

Обратите внимание, что предварительно скомпилированные заголовки очень специфичны для компилятора (с GCC они могут даже не работать при переходе с GCC 4.9.1 на GCC 4.9.2), поэтому вы не должны слишком сильно зависеть от них.

2

Другие решения

Во-первых, я не использовал pch с gcc только с компилятором Microsoft.

Условия #ifdef и т. Д. Все решаются до компиляции, поэтому, если вы измените переменную препроцессора, файл PCH все равно будет скомпилирован.
Так что просто добавьте все файлы из библиотек, которые вам нужны.

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

Не беспокойтесь слишком много раз о включении заголовков в ваш файл pch. Поскольку этот файл не будет компилироваться очень часто, вы можете игнорировать высокие времена компиляции здесь.

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

Теперь, исходя из моего опыта, еще один важный вопрос, если ваша производительность компиляции низкая при компиляции или при компоновке.

Когда у вас высокое время соединения, проблема, скорее всего, заключается в том, что вы включаете слишком много заголовков в заголовки вашего кода.

Это можно оптимизировать, используя декларации Forward в файлах заголовков и только включая заголовки в файлах .cpp. У нас были огромные монолитные проекты, и каждый раз наибольшее увеличение производительности для компиляции / компоновки происходило за счет удаления зависимостей заголовка путем предварительного объявления в максимально возможной степени.

Это связано с тем, что инкрементная компиляция работает очень хорошо, а инкрементная компоновка — нет.

Вот краткая, но хорошая подборка того, что можно и чего нельзя делать в отношении предварительной декларации:
http://www.chromium.org/developers/coding-style/cpp-dos-and-donts

1

По вопросам рекламы [email protected]