一、CMake 是什么?
CMake 是一个“跨平台的构建配置工具”
它不负责真正编译代码,而是:
生成 Makefile / Ninja / VS 工程文件, 再交给 make / ninja / MSVC 去编译。
关系图:
CMakeLists.txt --(cmake)--> Makefile / build.ninja
|
v
make / ninja
|
v
可执行文件 / 库
二、为什么不用直接写 Makefile?
因为 Makefile:
太难写
太容易错
不跨平台(Linux / Windows / macOS 差异巨大)
CMake 的优势:
| 能力 | 说明 |
|---|---|
| 跨平台 | 一份CMakeLists.txt到处用 |
| 自动依赖 | 自动处理头文件依赖 |
| 工程化 | 非常适合大项目(muduo、redis 都在用) |
| IDE 友好 | VSCode / CLion / VS 全支持 |
三、CMakeLists.txt
cmake_minimum_required(VERSION 3.0) project(main) add_executable(main main.cpp)cmake_minimum_required
cmake_minimum_required(VERSION 3.0)指定最低 CMake 版本
防止低版本 cmake 解析失败
project
project(main)作用:
定义工程名
自动生成一些变量:
PROJECT_NAME # main PROJECT_SOURCE_DIR # 工程根目录 PROJECT_BINARY_DIR # build 目录add_executable
add_executable(main main.cpp)含义:
用main.cpp生成一个可执行文件main
如果有多个源文件:
add_executable(main main.cpp test.cpp util.cpp)cmake_minimum_required(VERSION 3.0) project(main) # 配置编译选项 set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g) # 配置头文件搜索路径 #include_directories() # 配置库文件搜索路径 #link_directories() # 设置需要编译的源文件列表 set(SRC_LIST ./mudo_server.cpp)set(CMAKE_CXX_FLAGS ...)
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g)作用:
给所有 C++ 编译加参数
-g:生成调试信息(给 gdb 用)
头文件 & 库怎么配
头文件搜索路径
include_directories( ${PROJECT_SOURCE_DIR}/include )链接库文件
指定库目录
link_directories(/usr/local/lib)链接具体库
target_link_libraries(server muduo_net muduo_base pthread )推荐的“现代 CMake 写法”
cmake_minimum_required(VERSION 3.10) project(muduo_server) set(CMAKE_CXX_STANDARD 11) add_executable(server mudo_server.cpp ) target_include_directories(server PRIVATE /usr/local/include ) target_link_libraries(server muduo_net muduo_base pthread )为什么更好?
不污染全局
目标级别管理(server)
更适合大工程
标准编译流程
mkdir build cd build cmake .. make生成文件在:
build/server