Я хотел бы знать, удалось ли кому-нибудь здесь использовать 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?
У меня была такая же проблема, и я нашел рабочее решение (хотя и не идеальное, см. Ниже).
Скажи это 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
построены (я не знаю почему). Если это приемлемо для вас, это решение должно работать.