CMakeList项目构建
OVERVIEW
- CMakeList项目构建
- cmake
- 1.变量定义
- 2.指定源文件路径
- 3.指定头文件路径
- 4.字符串操作
- 5.日志打印
- 6.预定义宏
cmake、makefile都是项目构建工具,通过make命令进行项目构建,大多的IDE都集成了make项目构建,如visual studio的nmake、linux下的GUN make、Qt的qmake,但是makefile通常非常依赖于当前的编译平台,而且编写makefile的工作量较大,解决依赖关系时也容易出现错误,
CMake允许开发者指定整个工程的编译流程,再根据编译平台自动生成本地化Makefile和工程文件,最后用户只需输入make进行编译即可(自动生成makefile的工具),编译流程如下:
补充:可以为cmake编写特定功能模块,扩充cmake功能,
cmake
cmake支持大小写的混合的命令,
-
cmake_minimum_required
:指定使用的 cmake 的最低版本, -
project
:定义工程名称,指定工程版本、工程描述、web主页地址、支持的语言(默认支持所有语言),如不需要都可忽略只给出工程名称, -
add_executable(可执行程序名 源文件名称)
:定义工程会生成一个可执行程序,源文件名可以用空格 或者 分号隔开,可执行程序名和project中的项目名没有任何关系,
cmake_minimum_required(VERSION 3.10) project(test) add_executable(app add.cpp sub.cpp multi.cpp div.cpp main.cpp)
-
在创建的build目录中,执行
cmake ../
命令,生成makefile文件以及其他文件, -
在创建的build目录中,执行
make
命令,生成可执行的目标文件,
1.变量定义
cmake可以使用 set
命令为自定义的变量进行赋值操作,默认为字符串类型,SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
- 源文件指定
set(SRC_LIST add.cpp sub.cpp multi.cpp div.cpp main.cpp)
- 编译C++版本标准指定
set(DCMAKE_CXX_STANDARD 11)
- 输出路径指定
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)
cmake_minimum_required(VERSION 3.10)
project(test)
# 指定C++编译版本
set(DCMAKE_CXX_STANDARD 11)
# 指定HOME路径
set(HOME /home/luochenhao/GNU_TOOLS/cmakeTest/test1)
# 指定源文件路径
set(SRC_LIST add.cpp sub.cpp multi.cpp div.cpp main.cpp)
# 指定可执行文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)
add_executable(app ${SRC_LIST})
2.指定源文件路径
通过指令搜索来简化源文件添加的过程,可以使用 aux_source_directory
命令或者 file
命令,
aux_source_directory([dir] [variable])
file(GLOB/GLOB_RECURSE [变量名] [要搜索的文件路径和文件类型])
- CMAKE_CURRENT_SOURCE_DIR:当前CMakeList.txt文件所在的目录路径
- PROJECT_SOURCE_DIR:执行cmake命令时后面跟随的参数路径
cmake_minimum_required(VERSION 3.10)
project(test)
# 指定C++编译版本
set(DCMAKE_CXX_STANDARD 11)
# 指定HOME路径
set(HOME /home/luochenhao/GNU_TOOLS/cmakeTest/test1)
# 通过搜索的方式指定源文件路径
aux_source_directory(${PROJECT_SOURCE_DIR} SRC_LIST)
file(GLOB SRC_LIST ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
# 指定可执行文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)
add_executable(app ${SRC_LIST})
3.指定头文件路径
cmake_minimum_required(VERSION 3.10)
project(test)
# 指定C++编译版本
set(DCMAKE_CXX_STANDARD 11)
# 指定HOME路径
set(HOME /home/luochenhao/GNU_TOOLS/cmakeTest/test1)
# 通过搜索的方式指定头文件路径
include_directories(${HOME}/include)
# 通过搜索的方式指定源文件路径
aux_source_directory(${HOME}/src SRC_LIST)
# 指定可执行文件输出路径
set(EXECUTABLE_OUTPUT_PATH ${HOME}/bin)
add_executable(app ${SRC_LIST})
4.字符串操作
关于字符串拼接可以使用set命令,也可以使用list命令,
-
字符串拼接set:
set(target ${var1} ${var2} ...)
-
字符串追加list APPEND:
list(APPEND [list] [<element> ....])
-
字符串移除list REMOVE_ITEM:
list(REMOVE_ITEM [list] [<element> ....])
-
列表排序:
list (SORT list COMPARE compare CASE case ORDER order)
-
COMPARE:指定排序方法
STRING:按照字母顺序进行排序,为默认的排序方法
FILE_BASENAME:如果是一系列路径名,会使用basename进行排序
NATURAL:使用自然数顺序排序
-
CASE:指明是否大小写敏感
SENSITIVE:按照大小写敏感的方式进行排序,为默认值
INSENSITIVE:按照大小写不敏感方式进行排序
-
ORDER:指明排序的顺序
ASCENDING:按照升序排列,为默认值
DESCENDING:按照降序排列
-
-
获取 list 的长度:
list(LENGTH [list] [output variable])
- list列表
- 子命令LENGTH用于读取列表长度,
- 创建的变量,用于存储列表的长度,
-
读取列表中指定索引的的元素:
list(GET [list] [element index] [index ...] [output variable])
- list列表
- element index列表元素的索引
- 创建的变量,用于存储索引元素的返回结果也是一个列表,
-
将列表中的元素用连接符(字符串)连接起来组成一个字符串:
list (JOIN [list] [glue] [output variable])
- list列表
- glue指定的连接符(字符串)
- 创建的变量,用于存储返回的字符串
-
查找列表是否存在指定的元素,若果未找到,返回-1:
list(FIND [list] [value] [output variable])
- list列表
- value需要搜索的元素
- 创建的变量,如果列表中存在目标值,那么返回value在列表中的索引,否则返回 -1
-
在list中指定的位置插入若干元素:INSERT
-
将元素插入到列表的0索引位置:PREPEND
-
将列表中最后元素移除:POP_BACK
-
将列表中第一个元素移除:POP_FRONT
-
‘将指定索引的元素从列表中移除:REMOVE_AT
-
移除列表中的重复元素:REMOVE_DUPLICATES
-
列表翻转:REVERSE
# 字符串拼接
set(str1 hello world)
set(str2 ${str1} ${HOME})
message(${str1})
message(${str2})
# 字符串追加
list(APPEND str3 "this is a test." ${str2})
message(${str3})
# 字符串移除
message(${SRC_LIST})
list(REMOVE_ITEM SRC_LIST ${HOME}/src/main.cpp)
message(${SRC_LIST})
5.日志打印
message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] "your detail message." ...)
- 空:重要消息
- STATUS:非重要消息
- WARNING:CMake警告,会继续执行
- AUTHOR_WARNING:CMake警告,会继续执行
- SEND_ERROR:CMake错误,继续执行,但是会跳过生成的步骤
- FATAL_ERROR:CMake错误,终止所有处理过程
CMake的命令行工具会在stdout上显示STATUS消息,在stderr上显示其他所有消息,CMake的GUI会在的log区域显示所有消息。
# 输出一般日志信息
message(STATUS "source path: ${PROJECT_SOURCE_DIR}")
# 输出警告信息
message(WARNING "source path: ${PROJECT_SOURCE_DIR}")
# 输出错误信息
message(FATAL_ERROR "source path: ${PROJECT_SOURCE_DIR}")
6.预定义宏
宏 | 功能 |
---|---|
PROJECT_SOURCE_DIR | 执行cmake命令后的参数目录 |
PROJECT_BINARY_DIR | 执行cmake命令的目录 |
CMAKE_CURRENT_SOURCE_DIR | 当前处理的CMakeLists.txt所在的路径 |
CMAKE_CURRENT_BINARY_DIR | target 编译目录 |
EXECUTABLE_OUTPUT_PATH | 定义目标二进制可执行文件的存放位置 |
LIBRARY_OUTPUT_PATH | 定义目标链接库文件的存放位置 |
PROJECT_NAME | PROJECT指令定义的项目名称 |
CMAKE_BINARY_DIR | 项目实际构建路径,如果在build目录进行的构建,得到的就是该目录路径 |