首页 > 解决方案 > 添加/删除 .cpp 文件后,带有 PCH 的 CMake 重建所有项目

问题描述

我正在为我的大项目使用 CMake,并使用 target_precompile_headers 来生成 .pch 文件。

问题:每次我在目标源列表中添加或删除 .cpp 文件时,每个翻译单元都会重新编译

为了演示问题,我使用这种结构创建了非常基本的项目:

在此处输入图像描述

CMakeLists.txt 非常简单:

cmake_minimum_required(VERSION 3.16)
set(CMAKE_CXX_STANDARD 17)

project(SuperBasicProject)
set(TARGET_NAME ${PROJECT_NAME})

add_executable(${TARGET_NAME} main.cpp empty_cpp1.cpp)

target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_precompile_headers(${TARGET_NAME} PRIVATE my_pch.h)

第一次运行后的编译器输出:

Scanning dependencies of target SuperBasicProject
[ 25%] Building CXX object CMakeFiles/SuperBasicProject.dir/cmake_pch.hxx.pch
[ 75%] Building CXX object CMakeFiles/SuperBasicProject.dir/empty_cpp1.cpp.o
[ 75%] Building CXX object CMakeFiles/SuperBasicProject.dir/main.cpp.o
[100%] Linking CXX executable SuperBasicProject
[100%] Built target SuperBasicProject

然后我通过修改 add_executable 行将另一个源文件(empty_cpp2.cpp)添加到项目中:

 add_executable(${TARGET_NAME} main.cpp empty_cpp1.cpp empty_cpp2.cpp)

然后重新加载cmake并按下构建按钮。

编译器输出:

Scanning dependencies of target SuperBasicProject
[ 20%] Building CXX object CMakeFiles/SuperBasicProject.dir/cmake_pch.hxx.pch
[ 80%] Building CXX object CMakeFiles/SuperBasicProject.dir/empty_cpp2.cpp.o
[ 80%] Building CXX object CMakeFiles/SuperBasicProject.dir/main.cpp.o
[ 80%] Building CXX object CMakeFiles/SuperBasicProject.dir/empty_cpp1.cpp.o
[100%] Linking CXX executable SuperBasicProject
[100%] Built target SuperBasicProject

为什么每个翻译单元都被重新编译以及如何解决这个问题?那么目标是一个具有大量代码库的项目,这种行为是不可接受的。也许我使用 target_precompile_headers 错误,或者可能有另一种方法,它不会重新编译所有内容。我将不胜感激任何帮助。

标签: c++cmakeclion

解决方案


推荐阅读