我想知道这里是否有人设法使用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.h 和 precompiled.cc (仅包含预编译的)构建 precompiled.pch 。 h )在库文件可见的位置,然后从那里使用它来构建lib1和lib2。
可以使用CMake完成吗?
答案 0 :(得分:0)
我遇到了同样的问题并找到了一个有效的解决方案(尽管不完美,见下文)。
假设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
或{{1}}(我不是我知道为什么)。如果这对你来说是可以接受的,那么这个解决方案应该可行。