C++ C+;的单个共享预编译头+;使用CMake进行项目(多个库和可执行文件)

C++ C+;的单个共享预编译头+;使用CMake进行项目(多个库和可执行文件),c++,build,cmake,shared,precompiled,C++,Build,Cmake,Shared,Precompiled,我想知道这里是否有人设法使用CMake在项目中的单个位置构建预编译头,然后从该位置使用它来构建项目的其他库和可执行文件。我做到这一点的唯一方法是在每个库/可执行文件文件夹中手动复制pch文件,但我希望避免这样做,因为这需要大量的空间和时间 假设我有这个项目结构 root | include - precompiled.h - common_project_header_files | src | precompiled - precompiled.cc | lib1

我想知道这里是否有人设法使用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.h)构建precompiled.pch,然后从那里使用它来构建lib1和lib2


使用CMake可以做到这一点吗?

我也遇到了同样的问题,并找到了一个有效的解决方案(尽管不是完美的,请参见下文)。 假设
precompiled
是在build目录中创建
precompiled.pch
的build命令的目标。将自定义命令添加到预编译的
中,如下所示:

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)
我说这不完美的原因是(至少对我来说)
预编译。每次构建
lib1
lib2
时,都会从头开始重新构建pch(我不知道为什么)。但是,如果您可以接受这一点,那么这个解决方案应该是可行的