CMakeLists.txt
#
行注释
#[[ ]]
块注释
cmake_minimum_required()
project()
并可指定工程的版本、工程描述、web主页地址、支持的语言(默认情况支持所有语言),如果不需要这些都是可以忽略的,只需要指定出工程名字即可。
xxxxxxxxxx
31add_executable(<name> [WIN32] [MACOSX_BUNDLE]
2 [EXCLUDE_FROM_ALL]
3 [source1] [source2 ...])
Adds an executable target called <name>
to be built from the source files listed in the command invocation.
name
为最后生成的可执行文件逻辑名称,最后可能会根据平台不同. 比如wendous会加上.exe
后缀.
一个cmakelist中可以包含多个该函数,生成不同的可执行程序.
31set_target_properties(target1 target2 ...
2 PROPERTIES prop1 value1
3 prop2 value2 ...)
向目标指定构建时的特性,例如COMPILE_FLAGS
配置编译选项
一般将cmake生成的文件放入build
文件夹
x
1add_custom_target(Name [ALL] [command1 [args1...]]
2 [COMMAND command2 [args2...] ...]
3 [DEPENDS depend depend depend ... ]
4 [BYPRODUCTS [files...]]
5 [WORKING_DIRECTORY dir]
6 [COMMENT comment]
7 [JOB_POOL job_pool]
8 [JOB_SERVER_AWARE <bool>]
9 [VERBATIM] [USES_TERMINAL]
10 [COMMAND_EXPAND_LISTS]
11 [SOURCES src1 [src2...]])
按照指定命令添加目标. 且该目标不会产生任何输出并且总被认为是过时的. 可用于子目录使用已有库的编译.
xxxxxxxxxx
1target_link_libraries(<target> ... <item>... ...)
指明目标在链接时所需要的库.
xxxxxxxxxx
11add_dependencies(<target> [<target-dependency>]...)
指明目标之间的依赖关系,确保依赖在target
前被编译.
运行
21cmake -S . -B build
2# -S 代表源文件路径 -B 代表build路径
41#可用空格区分 也可用;区分
2set(SRC_LIST a.c b.c)
3# 获取变量VAR值时是 使用 ${VAR}
4add_executable(a.out ${SRC_LIST})
变量操作:
追加:
11set(VAR ${VAR} ${VAR1}) # a.k.a. VAR += VAR1
11list(APPEND VAR ${VAR} ${VAR1}) # 同上
移除:∏
21list(REMOVE_ITEM SRC ${PROJECT_SOURCE_DIR}/main.cpp)
2# 从SRC中移除main.cpp
21set(CMAKE_CXX_STANDARD 11)
2# 11 也可以换为17 20 ...
若路径不存在 则会自动创建
21set(HOME /home/robin/Linux/Sort)
2set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)
简化变量定义
方法一:
31# 搜索 src 目录下的源文件 将结果存放至 SRC_LIST
2aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST)
3add_executable(app ${SRC_LIST})
方法二:
xxxxxxxxxx
11file(GLOB/GLOB_RECURSE 变量名 要搜索的文件路径和文件类型)
Recursive 代表递归查询子目录的所有文件
xxxxxxxxxx
11file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
为编译器指定目录寻找文件.
相对路径的起点为当前的source 目录,被引入的目录加入当前的cmakelistINCLUDE_DIRECTORIES
中.
xxxxxxxxxx
31include_directories(${PROJECT_SOURCE_DIR}/include)
2#引用时可以直接用< > 以及 ""
3需要将include目录下的文件加入到SRC_LIST中
PROJECT_SOURCE_DIR 一般为工程的根目录
预定义宏 | 含义 |
---|---|
PROJECT_SOURCE_DIR | 使用cmake命令后紧跟的目录,一般为工程根目录 |
PROJECT_BINARTY_DIR | 执行cmake命令的目录 |
CMAKE_CURRENT_SOURCE_DIR | 当前处理的CMakeLists.txt所在目录 |
CMAKE_BUILD_TYPE | 构建类型 设置为Debug时相当于 g++ 编译时添加选项 -g. Release 时经过编译优化 不带调试信息 |
gcc中-D
xxxxxxxxxx
21add_definitions(-DDBUG)
2# 希望定义的宏为DEBUG
xxxxxxxxxx
91cmake_minimum_required(VERSION 3.26)
2project(what)
3
4set(CMAKE_CXX_STANDARD 11)
5include_directories(include)
6file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cc)
7file(GLOB INCLUDE_LIST include/*.h)
8set(SRC_LIST ${SRC_LIST} ${INCLUDE_LIST} main.cc)
9add_executable(${PROJECT_NAME} ${SRC_LIST})
嵌套cmake
控制流
库