1.1 cMake入门
1. 约定:
命令:PROJECT()、ADD_EXECUTABLE()(推荐大写)
变量:PROJECT_NAME、CMAKE_CXX_STANDARD(大写)
a.定义变量
set(MY_VAR "hello")
set(NUM 123)
# 列表(用分号分隔)
set(SRC_LIST main.cpp;foo.cpp;bar.cpp)
# 等价写法
set(SRC_LIST
main.cpp
foo.cpp
bar.cpp
)
b.使用变量
message(${MY_VAR})
add_executable(demo ${SRC_LIST})
c.常用变量
${PROJECT_NAME} # project()设置的项目名
${CMAKE_SOURCE_DIR} # CMakeLists.txt所在根目录(源码根目录)
${CMAKE_BINARY_DIR} # 构建输出目录(build目录)
${CMAKE_CURRENT_SOURCE_DIR} # 当前CMakeLists.txt所在目录
${CMAKE_CURRENT_BINARY_DIR}# 当前构建目录
${CMAKE_CXX_COMPILER} # C++编译器
${CMAKE_C_COMPILER} # C编译器
注释:# 单行注释,没有多行注释
2. 基础命令
2.1. project () 项目声明
project(MyDemo LANGUAGES C CXX) # LANGUAGES 指定语言:C/CXX/ASM
2.2.message () 打印日志
message(STATUS "构建开始") # 普通信息
message(WARNING "警告")
message(FATAL_ERROR "致命错误,直接终止cmake")
2.3.add_executable () 生成可执行程序
# 可执行文件名 源码列表
add_executable(demo main.cpp util.cpp)
2.4.add_library () 生成库
# 静态库libxxx.a / xxx.lib
add_library(mylib STATIC util.cpp)
# 动态库 libxxx.so / xxx.dll
add_library(mylib SHARED util.cpp)
# 目标库别名(方便链接)
add_library(mylib::mylib ALIAS mylib)
2.5 target_link_libraries 链接库
# demo 链接 mylib
target_link_libraries(demo PRIVATE mylib)
3.三个作用域:
PRIVATE:目标自己用,不对外暴露头文件PUBLIC:自己用,同时传递给依赖它的其他目标INTERFACE:只对外暴露,自身不使用
4.target_include_directories 设置头文件路径
target_include_directories(demo
PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/include
)
5.set 设置编译标准
set(CMAKE_CXX_STANDARD 17) # C++17
set(CMAKE_CXX_STANDARD_REQUIRED ON) # 强制要求,不允许降级
set(CMAKE_CXX_EXTENSIONS OFF) # 关闭编译器扩展(如GNU扩展)
6. if条件判断
if(WIN32)
message(STATUS "Windows平台")
elseif(UNIX)
message(STATUS "Linux/macOS")
else
message(STATUS "Android")
endif()
6.1 常用判断
# 判断变量是否存在
if(MY_VAR) endif()
# 取反
if(NOT MY_VAR) endif()
# 逻辑与、或
if(A AND B)
if(A OR B)
# 判断文件/目录存在
if(EXISTS "${CMAKE_SOURCE_DIR}/include")
endif()
# 判断是否相等
if(${CMAKE_CXX_STANDARD} STREQUAL "17")
endif()
6.2 平台内置判断宏:
WIN32:Windows
UNIX:Linux、macOS
APPLE:macOS / iOS
LINUX:Linux
7. 循环 foreach
set(FILE_LIST a.cpp b.cpp c.cpp)
foreach(file ${FILE_LIST})
message("文件:${file}")
endforeach()
# 数字循环
foreach(i RANGE 1 10)
message(${i})
endforeach()
8. 函数与宏(function /macro)
8.1 function(推荐,拥有独立作用域)
function(print_msg MSG)
message("消息:${MSG}")
endfunction()
print_msg("Hello CMake")
8.2 macro(变量作用域全局,容易踩坑,谨慎使用)
macro(print_macro MSG)
message("macro: ${MSG}")
endmacro()
9. 子目录 add_subdirectory(工程分层,多个模块时使用)
# 进入src目录,执行src/CMakeLists.txt
add_subdirectory(src)
add_subdirectory(thirdparty)
10. option 开关选项(方便编译时开启 / 关闭功能)
option(ENABLE_LOG "开启日志打印" ON)
if(ENABLE_LOG)
message("日志已开启")
endif()
注意:编译时以用 cmake -DENABLE_LOG=OFF .. 覆盖 option(ENABLE_LOG "开启日志打印" ON)
11. 字符串操作 string
string(TOUPPER hello OUT)
message(${OUT})
12. 最简完整示例 CMakeLists.txt
cmake_minimum_required(VERSION 3.16) # 最低cmake版本要求
project(Demo LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 源码列表
set(SRC
main.cpp
)
# 生成可执行文件
add_executable(demo ${SRC})
# 头文件目录
target_include_directories(demo PRIVATE ${CMAKE_SOURCE_DIR}/include)
13. 常用构建命令
# 创建build目录,外部构建(推荐,不要源码内编译)
mkdir build && cd build
cmake ..
make -j8
# Windows MSVC 下
cmake ..
cmake --build .
14. 易错点


浙公网安备 33010602011771号