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

Single shared precompiled header for C++ project (multiple libraries and executables) using CMake

本文关键字:单个 共享 可执行文件 编译 c++ CMake 项目 使用      更新时间:2023-10-16

我想知道这里是否有人设法使用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

我想首先构建预编译的。Pch 使用预编译。h预编译。Cc (只包括预编译的.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文件夹每当它被构建。但是,如果您的lib1lib2目标在precompiled之前构建,那么您仍然会遇到问题,因此您必须添加precompiled作为这两个目标的依赖项,以强制执行正确的构建顺序:

add_dependencies(lib1 precompiled)
add_dependencies(lib2 precompiled)

我说这是不完美的原因是(至少对我来说)precompiled.pch将从头开始重建每一次lib1lib2构建(我不知道为什么)。如果您可以接受,那么这个解决方案应该可以工作。