流程:预处理-->编译-->汇编-->链接-->可执行程序
CMake命令执行流程
1、编写CMakeLists.txt文件的基本配置
cmake_minimum_required(VERSION X.XX) #最小版本
project(UDF) #项目名
add_executable(UDF udf.cpp) #由源文件生成一个可执行程序
2、cmake -B build
创建一个build 并在此目录下生成makefile或其他文件
3、cmake --build build
生成项目
CMake语法(类似于命令式编程语言、仅涉及一部分)
变量操作set、list
CMake中的变量分为两种:CMake提供和自定义
CMake变量的命名区分大小写
CMake变量存储时都是字符串
CMake获取变量:${}
set方法
set(<variable><variable>...[PARENT_SCOPE])
#例子--单个变量
set(Var1 YZZY)
message(${Var1})
#例子--多个变量
set(LISTVALUE a1 a2)
message(${LISTVALUE})
list方法
list(APPEND <list> [<element>...]) #列表添加元素
list(REMOVE_ITEM <list> <value> [value...]) #列表删除元素
list(LENGTH <list> <output variable>) #获取列表元素个数
list(FIND <list> <value> <out-var>) #在列表中查找元素返回索引
list(INSERT <list> <index> [<element>...]) #在index位置插入
list(sort <list> [...]) #排序list
流程控制
if条件流程控制
if(<condition>)
<commands>
elseif(<condition>)
<commands>
else
<comands>
endif()
#例子
set(var TRUE)
if(var)
message(TRUE)
else()
message(FALSE)
endif()
if(NOT var)
message(TRUE)
else()
message(FALSE)
endif()
if(NOT var and var)
message(TRUE)
else()
message(FALSE)
endif()
if(NOT var or var)
message(TRUE)
else()
message(FALSE)
endif()
loop循环流程控制
#For循环
foreach(<loop_var> RANGE <max>)
<commanes>
endforeach
foreach(<loop_var> RANGE <min> <max> [<step>])
foreach(<loop_var> IN [LISTS <lists>] [ITEMS <items>])
#While
while(<condition>)
<commands>
endwhile()
函数不涉及,有兴趣可自行了解
作用域
CMake有两种作用域:Function scope和Directory scope
注意:Directory scope当从add_subdirectory()命令执行嵌套目录中的CMakeLists.txt列表文件时,父CMakeLists.txt其中的变量可以被子CMakeLists.txt使用
宏不涉及,有兴趣可自行了解
CMake构建项目的方式
直接写入源码路径
#项目较小
#add_executable中直接写入相对路径
#在源代码中引入头文件时需要写相对路径
CMakeLists嵌套
target_include_directorie #头文件目录的声明
target_link_libraries #连接库文件
add_subdirectory #添加子目录
add_library #生成库文件,默认STATIC library(静态库)
${PROJECT_SOURE_DIR} #源码目录即父CMakeLists.txt的目录
CMake生成动态库
lib<name>.so/dll #动态库命名
file() #搜索源文件
add_library(<name> SHARED ${SRC}) #生成动态库
${LIBRARY_OUTPUT_PATH} #导出目录
CMake调用动态库
1、引入头文件
2、声明库目录
3、生成可执行二进制文件
4、连接动态库