#c #cmake #clion
Вопрос:
Я использую 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
Затем я добавляю еще один исходный файл (empty_cpp2.cpp) для проекта путем изменения строки add_executable:
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
Почему каждая единица перевода перекомпилируется и как это исправить? Тогда целью является проект с кодовой базой hude, такое поведение неприемлемо. Может быть, я неправильно использую заголовки target_precompile_, или, может быть, есть другой способ, который не будет все перекомпилировать. Я был бы признателен за любую помощь.