深度学习张量基础与PyTorch实战指南
2026/10/29 12:08:04
| 维度 | CMake | Makefile |
|---|---|---|
| 本质 | 跨平台构建工具(生成器) | 编译规则脚本(依赖Make工具执行) |
| 核心作用 | 自动生成适配不同平台/编译器的Makefile(或VS工程、Ninja文件等) | 定义源码编译的依赖关系、编译命令,由Make解析执行 |
| 跨平台性 | 天然跨平台(Windows/Linux/macOS),语法统一 | 平台相关(如Windows需MinGW/MSYS,语法依赖Make工具版本) |
| 语法复杂度 | 高层抽象语法(如add_executable),易维护 | 底层脚本语法(需手动写依赖、命令),复杂项目易臃肿 |
| 适用场景 | 中大型/跨平台项目,适配多编译环境 | 小型Linux/Unix项目,需精准控制编译流程 |
| 执行逻辑 | 先执行cmake生成构建文件,再执行make编译 | 直接执行make解析Makefile完成编译 |
核心总结:
CMake是「构建文件生成器」,通过跨平台语法生成适配不同环境的Makefile(或其他构建文件);Makefile是「编译规则文件」,直接定义编译依赖和命令,依赖Make工具执行,仅适配类Unix环境。
本文整理了CMake构建过程中最常用的核心命令,涵盖版本设置、变量定义、项目配置、编译构建、安装部署等全流程,方便快速查阅和使用。
cmake_minimum_required(VERSION 3.1.3)cmake_minimum_required(VERSION 3.20)(推荐使用项目兼容的较高稳定版本)project(project_name) # 扩展:指定项目语言和版本 project(project_name LANGUAGES C CXX VERSION 1.0.0)PROJECT_NAME、PROJECT_VERSION等预定义变量。LANGUAGES:指定项目支持的编程语言(如C、CXX/C++、Fortran等);VERSION:设置项目版本号。# 单值赋值 set(variable "content") # 多值赋值(列表形式) set(variable content1 content2 content3) # 设置C++标准(核心常用) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 强制要求指定的C++标准,不兼容则报错CMAKE_CXX_STANDARD用于指定编译时的C++特性标准(如11/14/17/20),需配合CMAKE_CXX_STANDARD_REQUIRED确保生效。# 初始化空列表 set(variable_name "") # 向列表追加元素 list(APPEND variable_name "content1") list(APPEND variable_name "content2" "content3")| 变量名 | 说明 |
|---|---|
CMAKE_CXX_STANDARD | 指定C++编译标准(如11、17) |
CMAKE_CURRENT_BINARY_DIR | CMake执行命令时的工作目录(编译产物输出目录) |
CMAKE_CURRENT_SOURCE_DIR | 当前CMakeLists.txt文件所在的目录 |
CMAKE_INSTALL_PREFIX | 项目默认安装路径(默认:Unix为/usr/local,Windows为C:\Program Files) |
string(REPLACE ".old" ".new" dest_variable "original_string.old")dest_variable的值为original_string.new。include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/third_party/include )-I参数。target_include_directories(针对具体目标),避免全局污染。aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src src_files)add_executable(app_name ${src_files} main.cpp)app_name为可执行文件名称,后续为依赖的源码文件列表。target_link_libraries(app_name # 系统库/第三方库 pthread # 自定义库(需先通过add_library定义) ${CMAKE_CURRENT_SOURCE_DIR}/lib/libxxx.a my_custom_lib )-l参数。if (NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/config.h) message(FATAL_ERROR "配置文件config.h不存在,请检查!") endif()if/endif实现条件逻辑。EXISTS(存在)、NOT EXISTS(不存在)、IS_DIRECTORY(是否为目录)等判断条件。set(numbers 1 2 3 4 5) foreach(val IN LISTS numbers) message(STATUS "当前值:${val}") endforeach()foreach(变量 IN LISTS 列表变量)或foreach(变量 元素1 元素2)。# 普通状态提示(编译时输出,不中断) message(STATUS "当前编译目录:${CMAKE_CURRENT_BINARY_DIR}") # 警告提示(黄色输出,不中断) message(WARNING "未指定C++标准,默认使用C++11") # 致命错误(红色输出,中断编译) message(FATAL_ERROR "缺少核心依赖库,请安装后重试!")add_custom_command( TARGET app_name # 关联到指定目标 PRE_BUILD # 执行时机:编译目标前(可选:PRE_LINK/POST_BUILD) COMMAND echo "开始编译app_name..." # 要执行的指令 ARGS -n "编译时间:$(date)" # 指令参数 DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/version.h # 依赖文件(文件更新则重新执行) COMMENT "执行预编译检查..." # 编译时打印的提示信息 )PRE_BUILD:目标编译前(仅Visual Studio支持);PRE_LINK:编译完成后、链接前;POST_BUILD:链接完成后(最常用)。add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/test EXCLUDE_FROM_ALL)CMakeLists.txt。EXCLUDE_FROM_ALL表示子目录目标不加入默认构建(需手动指定构建)。# 安装可执行文件到指定目录 INSTALL(TARGETS app_name RUNTIME DESTINATION ${CMAKE_INSTALL_PREFIX}/bin # 可执行文件安装路径 LIBRARY DESTINATION ${CMAKE_INSTALL_PREFIX}/lib # 动态库安装路径(Unix) ARCHIVE DESTINATION ${CMAKE_INSTALL_PREFIX}/lib # 静态库安装路径(Unix) ) # 安装头文件 INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/app.h DESTINATION ${CMAKE_INSTALL_PREFIX}/include )make install时自动拷贝文件到对应目录。RUNTIME:可执行文件(Windows下的.exe、Unix下的可执行程序);LIBRARY:共享库(.so/.dylib);ARCHIVE:静态库(.a)。以上命令覆盖了CMake从基础配置、变量操作、编译构建到安装部署的核心场景:
cmake_minimum_required、project是每个CMakeLists.txt的必选开头;target_*系列命令(如target_include_directories、target_link_libraries)替代全局命令,降低耦合;message(STATUS)打印变量值,排查路径、依赖等问题;INSTALL命令配合CMAKE_INSTALL_PREFIX实现跨平台的安装路径控制。