# 指定CMake最低版本为3.16 cmake_minimum_required(VERSION 3.16) # 项目名称:singlefile_practice,支持C和C++两种语言 project(singlefile_practice LANGUAGES C CXX) # ========== C语言标准设置 ========== # 使用C11标准 set(CMAKE_C_STANDARD 11) # 要求严格遵循C标准,不允许编译器扩展 set(CMAKE_C_STANDARD_REQUIRED ON) # 禁用编译器特定的扩展 set(CMAKE_C_EXTENSIONS OFF) # ========== C++语言标准设置 ========== # 使用C++17标准 set(CMAKE_CXX_STANDARD 17) # 要求严格遵循C++标准,不允许编译器扩展 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 禁用编译器特定的扩展 # 禁用编译器特定的扩展 set(CMAKE_CXX_EXTENSIONS OFF) # ========== 包含目录设置 ========== # 添加include目录到编译器的头文件搜索路径 include_directories("./include") # ========== 源文件自动发现 ========== # 定义源代码根目录 # 定义源代码根目录 set(SOURCE_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/src") # 递归搜索src目录下所有C/C++源文件(.c .cc .cpp .cxx) # CONFIGURE_DEPENDS: 如果文件列表变化,自动重新运行CMake配置 file(GLOB_RECURSE PRACTICE_SOURCES CONFIGURE_DEPENDS "${SOURCE_ROOT}/*.c" "${SOURCE_ROOT}/*.cc" "${SOURCE_ROOT}/*.cpp" "${SOURCE_ROOT}/*.cxx" ) # 如果没有找到源文件,输出警告信息 if(NOT PRACTICE_SOURCES) message(WARNING "No C/C++ source files found under ${SOURCE_ROOT}") endif() # ========== 自动为每个源文件创建可执行文件目标 ========== # 遍历所有找到的源文件 foreach(SOURCE_FILE IN LISTS PRACTICE_SOURCES) # 计算源文件相对于src目录的相对路径 file(RELATIVE_PATH REL_PATH "${SOURCE_ROOT}" "${SOURCE_FILE}") # 将路径中的反斜杠和正斜杠替换为下划线 string(REPLACE "\\" "_" TARGET_NAME "${REL_PATH}") string(REPLACE "/" "_" TARGET_NAME "${TARGET_NAME}") # 将文件名中的点替换为下划线(例如:hello.c -> hello_c) string(REPLACE "." "_" TARGET_NAME "${TARGET_NAME}") # 为该源文件创建可执行文件目标 add_executable(${TARGET_NAME} "${SOURCE_FILE}") # 设置可执行文件的输出目录为 build/bin set_target_properties(${TARGET_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" ) # 输出编译日志信息 message(STATUS "Add target: ${TARGET_NAME} <- ${REL_PATH}") endforeach()