cmake基础语法快速介绍:
cmake注释形式:# 或 #{ }
表示字符串内容:引号“ ” 或者 不加引号直接输入
同一个 cmakelist 文件中,变量名不能重复。
不需要提前定义好变量,未定义的变量在使用时,会被自动创建
1.设定采用的cmake版本:cmake_minimum_required(VERSION 2.8.9)
2. 指定项目名称 :project (名称)
3. 生成可执行程序:add_executable(名称 所需源文件)
源文件可以是.c .cpp文件,可以输入多个源文件,彼此空格分隔
可以是包含源文件绝对路径或相对路径的cmake变量
4. 生成库文件:add_library(名称 库类型 所需源文件)
库类型分为:static/shared 静态库/动态库
源文件可以是.c .cpp文件,可以输入多个源文件,彼此空格分隔
可以是包含源文件绝对路径或相对路径的cmake变量
5. 设置变量值:set(变量名 变量值)
获取变量值:${变量名}
Set(CMAKE_CXX_STANDARD 17) 限定c++标准为17
Set(executeable_out_path 输出目录名称) 设定可执行程序输出目录
Cmake_Current_source_dir /project_source_dir 当前cmakelists 所在文件目录
6.链接静态库 :link_libraries(多个静态库文件名…),
可以用于动态库链接静态库,静态库链接静态库,可执行程序链接静态库。
7.链接动态库:Target_link_libraries(连接目标 权限 多个要链接的库名称…)
该命令一般需要放到cmakelist文件末尾,避免链接失败
可以用于动态库链接动态库,静态库链接动态库,
可执行程序链接动态库,也可以用于静态库连接静态库
Target 可以是源文件,动态库文件,可执行文件
动态库可能有多层依赖,这时候就需要限制动态库内容的传递
权限用来修饰动态库,限制传递依赖关系,
指令包括 public private interface 三种,默认public
Public 表示开放依赖关系,可以四处传递动态库内容到外部库
Private 表示该动态库仅向target开放。
Interface修饰动态库,表示该库对于target只有使用权,没有所有权,库内容对target隐藏
8. 非系统库cmake找不到,需要指定动态库、静态库存放目录,
才能连接到库: link_directories(库路径)
9.cmake 定义宏: Add_definitions(-D宏名称)
能定义多个宏,能在c/c++代码中生效
常见命令
1.获取指定目录下包含的文件信息列表
(1).两个输入参数
Aux_source_directory( 要搜索的目录 存放结果的变量)
(2). 三个输入参数
File(寻找文件的方式[选项:Glob普通搜索/Glob_resurce递归搜索]
存放结果的变量 要搜索的文件类型后缀: 比如.hpp .c)
2.设定要包含的头文件路径
include_directories( 要包含的头文件路径 )
3.调试命令,打印信息
Massage(信息类型 信息内容)
信息类型包括:
【此处略去不写】 表示是重要消息
【status】表示这是一般的消息
【warning】警告信息,程序会继续执行
【author_warning】警告信息,程序会继续执行
【send_error】错误,跳过当前正在执行的步骤,继续下一步
【Fatal_error】严重错误,cmake程序执行中止
4.添加多级cmakelist文件结构
一个大的cmake文件可以把任务拆分成多个模块,交给多个cmake文件来分别处理,然后每个cmake文件又可以下挂多个cmake文件。如此反复,可以将任务无限细分成多个可供cmake执行的小模块,因此可以让根部cmakelist统筹全局,让子cmakelist执行具体的操作
在父节点中添加语句:Add_subdirectory(子cmakelist路径)
子cmakelist路径下必须要有cmakelist文件
子cmakelist这一名称只是相对父节点而言,它本身就是一个可独立执行的cmake模块,并不受父节点干扰,按照正常方式编写cmake即可
子cmakelist 可以使用父节点的变量,父节点不能访问子节点定义的变量
Cmake字符串操作
List(命令 执行指令的列表 被操作的多个变量)
cmake只有一种形式的变量定义与使用方式,之前已经介绍
这里叫做列表,只是因为这个变量值,是由多个字符串拼接成的,
这一个字符串在cmake的底层实现中,仍然以未拼接形式区分着组成它的字符串,
形似一种字符串列表。因此可以用来执行 与列表数据结构相关的操作。
实际应用过程中,不需要管那么多,都是cmake变量。
命令包括:
(1).append 向列表追加多个字符串
(2).Remove_Item 移除列表中的指定的多个字符串
(3).Lenth 获取字符串列表长度
(4).Get 获取列表长度 List(get stringlist indexs… output)
Indexs索引值从0开始,也可以用负数索引列表。
-1表示倒数第一个字符串,可以输入多个索引,获取多个结果,
所有结果形成列表,保存到output中
输入索引不能超出stringlist索引范围,否则会中止cmake程序
(5).join 给列表内容添加制定连接符 比如:ab => a-b
List(join stringlist 连接符 带有连接符的stringlist输出)
(6).find 查找对应值
List(find stringlist 查找的内容 newoutput)
将查找到的数据保存到newoutput,没有找到返回-1
(7).insert 插入元素
List(insert stringlist 插入位置 追加的若干内容)
Prepend 插入到第一个元素
List(prepend stringlist 追加的若干内容)
(8).移除元素
Pop_back 删除最后一个元素,保存结果到list参数三
Pop_front 删除列表第一个元素,保存结果到list参数三
Remove_item 删除指定内容项
Remove_at 删除指定索引项
List(remove_duplicates stringlist) 删除stringlist重复出现的元素
(9).Reverse 逆转列表顺序
(10).排序
List(sort 要操作的列表 compare case deder)
Compare 用来指定排序规则
可选项包括 string 按照字母顺序排序
Natural 按照自然数顺序排序
File_basename 按照基础路径名字来排序
Case用来控制区分大小写
Sensitive 表示对大小写敏感,为默认值
Insensitive 表示不区分大小写
Drder用来控制排序顺序
Ascending 升序 descending 降序