MakeList的基本语法
1 CMake中所有变量都是string,变量使用${name}取值;在IF语句中可直接name取值;赋值或新建变量时直接name即可
2 指令使用-指令(参数1 参数2),指令中的参数用空格分开
3 指令大小写不敏感,而参数和变量是大小写敏感的
4 若某参数名中有空格,则要加双引号,如set(path “A File.cpp”)
5 变量可直接后接字符串拼接,如set(¥{project_name}_Src_Dir ./src)
构建方式
1 内部构建,会生成大量的临时文件,不建议使用
2 外部构建,将生成的临时文件放在build目录中,层次分明(CMake的GUI就是这种做法)
#在linux上的构建:1 编写makelist;2 执行cmake命令生成makefile;3 执行make命令生成最终文件
关键字
1 project(项目名称 VERSION 1.0.0 LANGUAGE C CXX)
指定项目名称,版本和使用语言(相当于定义变量)
2 set(变量名 参数1 参数2…)
设置/新建变量的值,若是多个参数,则这个变量相当于数组,包含了全部参数
unset取消声明变量
3 cmake_minimum_required(VERSION 3.3.0)
指定cmake最小版本
4 aux_source_directory(目录 变量名)
读取指定目录中的所有源文件,将它们全部存到指定变量中
file(GLOB/GLOB_RECURSE 变量 正则)
按照正则查找文件,路径保存至变量中
5 target_link_libraries(exe名 lib1 lib2)
告诉编译器此exe文件需要链接到指定lib
link_libraries(exe名 dir1 dir2)指定整个项目所使用的lib目录
需要注意的是target使用的是具体的lib文件,而非target是包含目录
6 target_include_directories(exe名 路径1 路径2…)
指定生成的exe文件所需要包含的头文件的目录(即include目录)
include_directories(dir1 dir2 …)则是指定整个项目的include目录
7 add_executable(exe名 源文件1 源文件2)
从源文件中生成最终的exe文件,源文件可以是一个也可以是多个文件
多文件一般通过set(src_list 多个参数)->add_executable(goal ¥{src_list})(list即全部源文件)
8 add_library(库名 [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)
从指定源文件中生成lib文件,shared为动态库,static为静态库
9 add_compile_options(编译参数)
添加编译参数
10 add_subdirectories(path)//不加前缀默认为当前目录
将指定目录加入项目中,且加入的目录必须要有自己的makelist来处理自己的源文件
目录1makelist–处理目录1中的文件;目录2makelist–处理目录2中的文件//分开处理
当cmake执行到add_subdirectories时,会跳转执行子目录的makelist而不是继续执行下去
11 include(path)
将指定cmake文件包含至项目中
12 message([选项]“字符串”)
输出指定字符串,引用变量时,要使用单引号"…‘${变量名}’ "
选项有-不加=普通信息;SEND_ERROR,产生错误,生成过程被跳过;SATUS,输出前缀为—的信息
FATAL_ERROR,立即终止所有 cmake 过程.
13 find_package(参数)
用于包含第三方库,从CMAKE_MODULE_PATH中的文件夹列表中搜索“ FindXXX.cmake”中的CMake模块
参数形式往往记录于FindXXX.cmake文件的顶部
在包含成功后,会有一系列变量新增到项目中,通过这些变量来寻找三方库相关信息
14 option(选项名 “说明” ON/OFF(若不写默认OFF))
在项目中定义一个宏,用于if语句的条件判断;只有在option之后宏才存在,不会存在于之前的代码中
单独的option只影响makelist文件,若要影响到源文件,则要配合config文件才行
set(选项名 ON CACHE BOOL “说明” FORCE),修改选项的值,相当于缓存变量
生成的对应宏在CMakeCache.txt文件中可以找到
15 if
基本格式:if(…)
…
elseif(…)
…
else…
endif()
if(var)/if(DEFINED var),判断变量是否被定义;if(var)还可以根据变量的值返回判断结果
if(A AND/OR/NOT B),并与或与非运算
if(EXISTS 目录或文件名(路径)),若文件/目录存在则为真
if(A GREATER/LESS/EQUAL/LESS_EUQAL B),大于小于等于
if(str MATCHES reg),判断str是否匹配正则
16 set(变量名 值 CACHE 类型(如STRING) “说明”)
添加缓存变量,存储于CMakeCache.txt中
常用变量
1 LIBRARY_OUTPUT_PATH,可设置其以改变库文件最终输出的位置
EXECUTABLE_OUTPUT_PATH,可设置exe最终输出的位置
2 CMAKE_CURRENT_SOURCE_DIR,当前所处理的makelist文件所在的目录
关于子目录
一般子目录的makelist基本格式如下:
aux_source(当前路径)
add_library(lib名)
然后在父目录中:
target_link_libraries(子目录所生成的lib)
这样就解决了不同目录之间的依赖关系
config文件
CMake提供了config文件,使得可以读取makelist中的option,以影响到源文件
基本就是通过编写config.h.in文件来define,然后cmake根据此文件生成config.h,最后在源代码中include"config.h",则makelist中的一系列宏定义都在代码中可见
1 .in文件:
可以直接使用#define XXX(值),来直接生成新的宏
如#define version 1.1
或set(mversion 1.1)之后,#define version @mversion@(双@表示在makelist中寻找指定变量作为值赋给此宏)
若引用的变量为字符串,则要写成"@var@“,即用双引号括起来
也可以使用#cmakedefine XXX,此指令在makelist中寻找是否有相应的option所定义的宏,若XXX为ON,则此指令相当于#define XXX;若为OFF,则等于#undef XXX
不仅可以用于条件编译,也可以用于将makelist中实际的值传递到源代码中(如整数小数等)
2 生成config文件
在makelist中执行此指令:configure_file(.in文件路径 .h文件路径),就生成了config.h
3 源文件
生成了config文件后,就可以在源代码中使用了
如:
#ifdef XXX
#include"MyLib”
#else
#include"OtherLib"
#endif