Ответ 1
Эти режимы полезны, если у вас есть цель, предназначенная для повторного использования (обычно это библиотека). PRIVATE
определения применяются только к целевой библиотеке, но не к другим объектам, использующим эту библиотеку. INTERFACE
определения применяются только к зависимым объектам, но не к самой библиотеке. Определения PUBLIC
применяются как к целевой библиотеке, так и к целевым объектам.
Пример:
add_library(test test.cc)
add_executable(main main.cc)
target_compile_features(test PUBLIC cxx_delegating_constructors)
target_link_libraries(main test)
// "target_compile_features(main cxx_delegating_constructors)" is
// implicitly set by CMake