Я видел несколько (старых) сообщений в сети о том, как совместить некоторую поддержку предварительно скомпилированных заголовков в CMake. Все они кажутся немного разрозненными, и у каждого свой способ делать это. Как лучше всего это сделать в настоящее время?
c++
visual-studio
gcc
cmake
precompiled-headers
Клейкий
источник
источник
Я использую следующий макрос для создания и использования предварительно скомпилированных заголовков:
Допустим, у вас есть переменная $ {MySources} со всеми вашими исходными файлами, код, который вы хотели бы использовать, будет просто
Код все равно будет нормально работать и на платформах, отличных от MSVC. Довольно аккуратно :)
источник
list( APPEND ... )
закрытие наружуendif()
. Смотрите полный код здесь: pastebin.com/84dm5rXZ/Yu
и/FI
аргументы, их должно быть${PrecompiledHeader}
и нет${PrecompiledBinary}
./YuC:/foo/bar.h
, вы будете вынуждены либо передать/FpC:/foo/bar.h
флаг, либо поместить его#include <C:/foo/bar.h>
в начало всех ваших файлов .cpp в качестве первого оператора include. MSVC выполняет строковое сравнение#include
аргументов, но не проверяет, указывает ли он на тот же файл, что и был задан/Yu
. Ergo,#include <bar.h>
не будет работать и выдаст ошибку C2857.CMake только что получил поддержку PCH, он должен быть доступен в следующем выпуске 3.16, который выйдет 01.10.2019:
https://gitlab.kitware.com/cmake/cmake/merge_requests/3553
Продолжается обсуждение поддержки совместного использования ПКП между целями: https://gitlab.kitware.com/cmake/cmake/issues/19659
Дополнительный контекст (мотивация, числа) доступен по адресу https://blog.qt.io/blog/2019/08/01/precompiled-headers-and-unity-jumbo-builds-in-upcoming-cmake/
источник
Вот фрагмент кода, позволяющий использовать предварительно скомпилированный заголовок для вашего проекта. Добавьте следующее в свой CMakeLists.txt, заменив
myprecompiledheaders
иmyproject_SOURCE_FILES
при необходимости:источник
with set( CMAKE_AUTOMOC ON )
.myprecompiledheader.cpp
сначала убедиться, что он скомпилирован? Судя по этому фрагменту, он будет скомпилирован последним, так что, возможно, именно это может быть причиной задержки.myprecompiledheader.h
содержит только самые распространенные заголовки STL, которые использует мой код.В итоге я использовал адаптированную версию макроса larsm. Использование $ (IntDir) в качестве пути к pch сохраняет предварительно скомпилированные заголовки для отладочной и выпускной сборок отдельно.
источник
Адаптировано от Дэйва, но более эффективно (задает целевые свойства, а не для каждого файла):
источник
abc
в твоем примере?если вы не хотите изобретать велосипед, просто используйте либо Cotire, как предлагает верхний ответ, либо более простой - cmake-precompiled-header здесь . Чтобы использовать его, просто включите модуль и вызовите:
источник
CMake 3.16 представил поддержку предварительно скомпилированных заголовков. Есть новая команда CMake,
target_precompile_headers
которая делает все, что вам нужно, под капотом. См. Его документацию для получения дополнительных сведений: https://cmake.org/cmake/help/latest/command/target_precompile_headers.htmlисточник
Пример использования предварительно скомпилированного заголовка с cmake и Visual Studio 2015
"stdafx.h", "stdafx.cpp" - имя предварительно скомпилированного заголовка.
Поместите следующее в корневой файл cmake.
Поместите следующее в файл cmake проекта.
«src» - папка с исходными файлами.
источник
IMHO, лучший способ - установить PCH для всего проекта, как предложил Мартино, в сочетании с возможностью игнорировать PCH для некоторых источников, если это необходимо (например, сгенерированные источники):
Итак, если у вас есть цель MY_TARGET и список сгенерированных источников IGNORE_PCH_SRC_LIST, вы просто сделаете:
Этот подход проверен и отлично работает.
источник
Хорошо, когда сборка занимает 10+ минут на четырехъядерном компьютере каждый раз, когда вы меняете одну строку в любом из файлов проекта, он сообщает вам, что пора добавить предварительно скомпилированные заголовки для Windows. В * nux я бы просто использовал ccache и не беспокоился об этом.
Я реализовал свое основное приложение и несколько библиотек, которые оно использует. На данный момент он отлично работает. Также необходимо создать исходный файл pch и файл заголовка, а в исходный файл включить все заголовки, которые вы хотите предварительно скомпилировать. Я делал это с MFC 12 лет, но мне потребовалось несколько минут, чтобы вспомнить это ..
источник
Самый простой способ - добавить предварительно скомпилированный параметр в качестве глобального параметра. В файле vcxproj это будет отображаться как,
<PrecompiledHeader>Use</PrecompiledHeader>
а не для каждого отдельного файла.Затем вам нужно добавить эту
Create
опцию в StdAfx.cpp. Вот как я его использую:Это проверено и работает для MSVC 2010 и создаст файл MyDll.pch, меня не беспокоит, какое имя файла используется, поэтому я не пытался его указать.
источник
Поскольку параметр предварительно скомпилированного заголовка не работает для файлов rc, мне нужно было настроить макрос, предоставляемый jari.
Изменить: использование этих предварительно скомпилированных заголовков сократило общее время сборки моего основного проекта с 4 минут 30 секунд до 1 минуты 40 секунд. Для меня это действительно хорошо. В заголовке прекомпиляции есть только заголовки типа boost / stl / Windows / mfc.
источник
Даже не ходи туда. Предварительно скомпилированные заголовки означают, что всякий раз, когда изменяется один из заголовков, вам нужно все перестраивать . Вам повезло, если у вас есть система сборки, которая это понимает. Чаще, чем никогда, ваша сборка просто терпит неудачу, пока вы не поймете, что изменили что-то, что предварительно скомпилировано, и поэтому вам нужно выполнить полную перестройку. Вы можете избежать этого в основном, предварительно скомпилировав заголовки, которые, как вы абсолютно уверены, не изменятся, но тогда вы также отказываетесь от значительной части прироста скорости.
Другая проблема заключается в том, что ваше пространство имен загрязняется всевозможными символами, которые вы не знаете или не заботитесь во многих местах, где вы будете использовать предварительно скомпилированные заголовки.
источник