CMakeLists.txt基本语法说明
本文最后更新于:2022年5月29日 上午
前言
最近开始使用CMake进行构建项目工程,CMake工程必有一个CMakeLists.txt
配置文件,这里记录一些CMakeLists.txt的基本语法。
俗话说:好记性不如烂笔头。更何况我还没有好记性呢~
常用指令
1、cmake_minimum_required
语法: cmake_minimum_required(cmake_Version)
**指令功能: ** 指定cmake最小版本
**例子: ** cmake_minimum_required(VERSION 3.1.0)
说明: 这行命令是可选的,但在有些情况下,如果 CMakeLists.txt 文件中使用了一些高版本 cmake 特有的一些命令的时候,就需要加上这样一行,提醒用户升级到该版本之后再执行 cmake。
2、project
语法: project(projectname [CXX] [C] [Java])
**指令功能: **定义工程名称,指定工程支持的语言
**例子: ** project(HELLO)
说明:
- 一般支持语言列表会省略
- 这里指定的是工程名,和生成的可执行文件的名不一定要一样的,二者没什么关系。
- 该指令隐式的定义了两个cmake变量:projectname_BINARY_DIR 以及projectname_SOURCE_DIR,例子就是 HELLO_BINARY_DIR 和HELLO_SOURCE_DIR,分别表示构建路径和项目路径。这两个值和CMake的预定义变量PROJECT_BINARY_DIR和PROJECT_SOURCE_DIR值是一样的,建议使用后者。
3、set
语法: set(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
指令功能: 用来显式的定义变量
例子: set (SRC_LST main.c other.c)
说明: 用变量代替值,例子中定义SRC_LST代替后面的字符串。
set 追加设置变量的值
1
2set(SRC_LIST main.cpp)
set(SRC_LIST ${SRC_LIST} test.cpp) # 追加list 追加或者删除变量的值
1
2
3set(SRC_LIST main.cpp)
list(APPEND SRC_LIST test.cpp) # 追加
list(REMOVE_ITEM SRC_LIST main.cpp) # 删除
4、add_executable
语法: add_executable(可执行文件名 依赖的文件列表)
指令功能: 制定生成的可执行文件的名和源文件列表
例子: add_executable(hello ${SRC_LIST})
说明: 变量的用法,除了在IF语句里,当要用变量的值时候,就要像例子中一样使用。
5、add_subdirectory
语法: add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
指令功能: 用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。EXCLUDE_FROM_ALL参数的含义是将这个目录从编译过程中排除。
例子: add_subdirectory(src bin)
说明: 例子中将src子目录加入工程,把可执行文件生成在执行cmake ..的目录的bin目录下,如果不加bin参数,则放在执行cmake ..的目录的src目录下,并且与src的文件名对应。
6、message
语法: message([SEND_ERROR | STATUS | FATAL_ERROR] “message to display”…)
指令功能: 输出信息
例子: message (STATUS “The binary dir is ${PROJECT_BINARY_DIR}”)
说明: 输出信息的类型解释:
- SEND_ERROR:产生错误,跳过。
- SATUS:输出以-为前缀的提示信息。
- FATAL_ERROR:立即终止所有cmake过程。
7、aux_source_directory
语法: aux_source_directory(source_dir variable)
指令功能: 将某个目录下的文件存储在某个变量内
例子: aux_source_directory (“${PROJECT_SOURCE_DIR}/src” DIR_SRCS)
说明: 例子中将工程目录下的src文件夹下的所有文件存储在DIR_SRCS变量中。后面制定生成的可执行文件可使用:add_executable(目标文件 ${DIR_SRCS} )
8、include_directories
语法: include_directories( [AFTER|BEFORE] [SYSTEM] dir1 [dir2 …])
指令功能: 将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径。
例子: include_directories (“${PROJECT_SOURCE_DIR}/include/“ )
说明: 例子中将工程目录下的include文件夹添加到编译器的头文件搜索路径之下。
常用变量
PROJECT_SOURCE_DIR:工程的根目录
PROJECT_BINARY_DIR:运行 cmake 命令的目录,通常是 ${PROJECT_SOURCE_DIR}/build
PROJECT_NAME:返回通过 project 命令定义的项目名称
CMAKE_CURRENT_SOURCE_DIR:当前处理的 CMakeLists.txt 所在的路径
CMAKE_CURRENT_BINARY_DIR:target 编译目录
CMAKE_CURRENT_LIST_DIR:CMakeLists.txt 的完整路径
CMAKE_CURRENT_LIST_LINE:当前所在的行
CMAKE_MODULE_PATH:定义自己的 cmake 模块所在的路径,SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake),然后可以用INCLUDE命令来调用自己的模块
EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置
LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置