Подтвердить что ты не робот

Каковы преимущества и недостатки предварительно скомпилированных заголовков в среде GNU/Linux/цепочке инструментов?

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

Каковы преимущества и недостатки использования предварительно скомпилированных заголовков и, в частности, как их использовать в среде Gnu/gcc/Linux?

4b9b3361

Ответ 1

Единственное потенциальное преимущество для предварительно скомпилированных заголовков заключается в том, что если ваши сборки слишком медленные, предварительно скомпилированные заголовки могут ускорить их. Потенциальные минусы:

  • Больше зависимостей Makefile, чтобы получить право; если они ошибаются, вы быстро строите неправильную вещь. Нехорошо.

  • В принципе, не каждый сборник может быть предварительно скомпилирован. (Подумайте о том, чтобы положить #define перед #include.) Итак, какие случаи gcc действительно получают право? Сколько вы хотите доверять этой функции, связанной с кровотечением.

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

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

  • Использование такого инструмента, как AT & T nmake или как ccache (Dirk прав), оба из которых используют надежные методы, чтобы избежать перекомпиляции.

Ответ 2

Я не могу разговаривать с GNU/gcc/linux, но я имел дело с предварительно скомпилированными заголовками в vs2005:

Плюсы:

  • Сохраняет время компиляции, когда у вас есть большие заголовки, которые содержат множество модулей включают.
  • Хорошо работает в заголовках (скажем от третьего лица), которые меняются очень нечасто.

Минусы:

  • Если вы используете их для заголовков, которые меняются много, он может увеличить время компиляции.
  • Может быть сложно настроить и поддерживать.
  • Есть случаи, когда изменения заголовков, по-видимому, игнорируются если вы не заставляете компилировать предварительно скомпилированный заголовок.

Ответ 3

ccache кэширование интерфейса с gcc, g++, gfortran,... отлично работает для меня. Как говорится на веб-сайте

ccache - это кэш компилятора. Он действует как кэширующий препроцессор для C/С++ компиляторы с использованием компилятора -E переключатель и хэш, чтобы определить, когда компиляция может быть выполнена из кэш. Это часто приводит к 5-10 раза быстрее в общих компиляциях.

В Debian/Ubuntu просто сделайте "apt-get install ccache" и создайте софт-ссылки, например, /usr/local/bin с именами gcc, g++, gfortran, c++,... эта точка до /usr/bin/ccache.

[EDIT] Чтобы сделать это более явным в ответ на некоторые ранние комментарии: это обеспечивает по существу предварительно скомпилированные заголовки и источники путем кэширования большего фрагмента этапа компиляции. Поэтому он использует идею, похожую на предварительно скомпилированные заголовки, и переносит ее дальше. Ускорение может быть драматичным - в 5-10 раз, как говорится в веб-сайте.

Ответ 4

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

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

Ответ 5

Документация GNU gcc обсуждает возможные ошибки с предварительно скомпилированными заголовками.

Ответ 6

Я использую PCH в проекте Qt, который использует cmake как систему сборки, и это экономит много времени. Я схватил некоторые скрипты CMH CMake, которые нуждались в некоторой настройке, поскольку они были довольно старыми, но обычно было легче настроить, чем я ожидал. Я должен добавить, я не очень разбираюсь в эксперте по cmake.

Сейчас я включаю большую часть Qt (QtCore, QtGui, QtOpenGL) и несколько стабильных заголовков сразу.

Плюсы:

  • Для классов Qt передовые декларации не требуются, и, конечно же, нет.
  • быстро.
  • Простота настройки.

Минусы:

  • Вы не можете включить PCH в заголовки. Это не большая проблема, за исключением того, что вы используете Qt и позволяете системе сборки переводить файлы moc seperatly, что происходит именно в моей конфигурации. В этом случае вам нужно # включить заголовки qt в заголовки, потому что mocs выделяются из заголовков. Решение заключалось в том, чтобы добавить дополнительные защитные элементы вокруг #include в заголовке.