build — Один общий предварительно скомпилированный заголовок для проекта C ++ (несколько библиотек и исполняемых файлов) с использованием CMake

Я хотел бы знать, удалось ли кому-нибудь здесь использовать CMake для создания предварительно скомпилированного заголовка в одном месте в проекте, а затем использовать его из этого места для создания других библиотек и исполняемых файлов проекта. Единственный способ сделать это — скопировать вручную файл pch в каждую библиотеку / исполняемую папку, но я хочу избежать этого, потому что это занимает много места и времени.

Скажи, у меня есть эта структура проекта

root
| include
- precompiled.h
- common_project_header_files
| src
| precompiled
- precompiled.cc
| lib1
- source/header files for lib1
| lib2
- source/header files for lib2
| lib

Я хотел бы сначала построить precompiled.pch с помощью precompiled.h а также precompiled.cc (который включает в себя только precompiled.h) в месте, видимом для файлов библиотек, а затем используйте его для сборки lib1 и lib2.

Можно ли это сделать с помощью CMake?

1

Решение

У меня была такая же проблема, и я нашел рабочее решение (хотя и не идеальное, см. Ниже).
Скажи это precompiled является целью команды сборки, которая создает ваш precompiled.pch в каталоге сборки. Добавить пользовательскую команду в precompiled, вот так:

add_custom_command(TARGET precompiled POST_BUILD
COMMAND ${CMAKE_COMMAND} -E
copy  "${CMAKE_BINARY_DIR}/precompiled.pch""${CMAKE_SOURCE_DIR}/include/precompiled.pch")

Это будет копировать precompiled.pch в ваш include папка, когда она построена. Тем не менее, вы все равно столкнетесь с проблемами, если ваш lib1 а также lib2 цели строятся раньше precompiledтак что вы должны добавить precompiled как зависимость этих двух для обеспечения правильного порядка сборки:

add_dependencies(lib1 precompiled)
add_dependencies(lib2 precompiled)

Причина, по которой я сказал, что это не идеально, в том, что (по крайней мере, для меня) precompiled.pch будет восстанавливаться с нуля каждый раз lib1 или же lib2 построены (я не знаю почему). Если это приемлемо для вас, это решение должно работать.

0

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


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