cmake_minimum_required(VERSION 3.10) project(exercises C CXX) set(CMAKE_C_STANDARD 11) set(CMAKE_C_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) file(GLOB_RECURSE SOURCES "*.cpp" "*.c") foreach (source ${SOURCES}) # 获取源文件所在目录(绝对路径) get_filename_component(dir ${source} DIRECTORY) # 计算相对于源码根目录的路径 file(RELATIVE_PATH rel_dir ${CMAKE_CURRENT_SOURCE_DIR} ${dir}) # 获取文件名(不带扩展名) get_filename_component(name ${source} NAME_WE) # 构造带相对路径的目标名,例如 src_utils_foo if (rel_dir STREQUAL "") set(target_name "${name}") else () string(REPLACE "/" "__" rel_dir_flat "${rel_dir}") set(target_name "${rel_dir_flat}__${name}") endif () add_executable(${target_name} ${source}) # 把可执行文件输出到与源文件对应的目录中 set_target_properties(${target_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${rel_dir}" ) endforeach ()