一、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
cpp
cmake_minimum_required(VERSION 3.0)
project(main)
add_executable(main main.cpp)
cmake_minimum_required
cpp
cmake_minimum_required(VERSION 3.0)
指定 最低 CMake 版本
防止低版本 cmake 解析失败
project
cpp
project(main)
作用:
定义工程名
自动生成一些变量:
cpp
PROJECT_NAME # main
PROJECT_SOURCE_DIR # 工程根目录
PROJECT_BINARY_DIR # build 目录
add_executable
cpp
add_executable(main main.cpp)
含义:
用 main.cpp 生成一个可执行文件 main
如果有多个源文件:
cpp
add_executable(main main.cpp test.cpp util.cpp)
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 ...)
cpp
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g)
作用:
给 所有 C++ 编译加参数
-g:生成调试信息(给 gdb 用)
头文件 & 库怎么配
头文件搜索路径
cpp
include_directories(
${PROJECT_SOURCE_DIR}/include
)
链接库文件
指定库目录
cpp
link_directories(/usr/local/lib)
链接具体库
cpp
target_link_libraries(server
muduo_net
muduo_base
pthread
)
推荐的"现代 CMake 写法"
cpp
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)
更适合大工程
标准编译流程
cpp
mkdir build
cd build
cmake ..
make
生成文件在:
cpp
build/server