1.cmake_minimum_required(VERSION 3.4.1) # 指定最低支持版本
2.aux_source_directory(. DIR_SRCS)
查找(第一个参数.)当前目录所有源文件,并将源文件名称列表保存到(第二个参数)DIR_SRCS变量
不能查找字目录
3.add_library
添加一个库名为<name>
指定STATIC,SHAREN,MODULE参数来指定库的类型。STATIC:静态库;SHARED:动态库,MOULE:在使用dyld的系统有效,若不支持dyld,等同于SHARED。
EXCLUDE_FROM_ALL:标识该库不会被默认构建。
source1 source2…… sourceN:用来指定库的源文件
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL] source1 source2 ……sourceN}
导入预编译库
添加一个已存在的预编译库,名为<name>。
一般配合set_target_properties使用
add_library(test SHARED IMPORTED)
set_target_properties(
test #指名目标库名
PROPERTIES IMPORTED_LOCATION #指明要设置的参 数库路径/${ANDROID_API}/libtest.so #导入库的路径
)
4.设置CMake变量
#设置可执行文件的输出路径(EXCUTABLE_OUTPUT_PATH是全局变量)
set(EXECUTABLE_OUTPUT_PATH[output_path])
#设置库文件的输出路径(LIBRARY_OUTPUT_PTAH 是全局变量)
set(LIBRARY_OUTPUT_PTAH [output_path])
#设置C++编译参数(CMAKE_CXX_FLAGSs是全局变量)
set(CMAKE_CXX_FLAGS "-Wall std=c++11")
#设置源文件集合(SOURCE_FILES是本地变量即自定义变量)
set(SOURCE_FILES main.cpp test.cpp ...)
5.设置头文件目录,相当于g++选项中的-i参数
#可以用相对或绝对路径,也可以用自定义的变量值
include_directories(./include ${MY_INCLUDE})
6.添加可执行文件
add_executable(<name> ${SRC_LIST})
7.将若干个库连接到目标库文件。连接的顺序应当符合gcc链接顺序的规则,被链接的库放在依赖他的库的后面,即如果上面的命令,lib1依赖于lib2,lib2又依赖于lib3,则在下面命令中必须严格按照lib1 lib2 lib3 的顺序排列,否则会报错
target_link_libraries(<name> lib1 lib2 lib3)
#如果出现互相依赖的静态库,CMake会允许依赖途中的包含循环依赖,如:
add_library(A STATIC a.c)
add_library(B STATIC b.c)
target_link_libraries(A B)
target_link_libraries(B A)
add_executable(main main.c)
target_link_libraries(main A)
8.为当前路径以及子目录的源文件加入由-D引入的define flag
add_definitions(-DFOO -DDEBUG ...)
9.如果当前目录下还有子目录时可以使用add_subdirectory,子目录中也需要包含有CMakeLists.text
#sub_dir指定包含CMakeLists.txt和源码文件的子目录位置
#binary_dir是输入路径,一般可以不指定
add_subdirecroty(sub_dir [binary_dir])
10.文件操作命令
#将message 写入filename文件中,会覆盖文件原有内容
file(WRITE filename "message")
#将message写入filename文件中,会追加在文件末尾
file(APPEND filename "message")
#从filename文件中读取内容并存储到var 变量中,如果指定了numBytes 和offset
#则从offset处开始最多读numBytes个字节,另外如果指定了HEX 参数,则内容会议十六进制形式存储在var变量中
file(READ filename var [LIMIT numBytes] [OFFSET offset] [HEX])
#重命名文件
file(RENAME <oldname> <newname>)
#删除文件,等于rm
file(REMOVE [file1 ...])
#递归的执行删除文件命令,等于 rm -r
file(REMOVE_RECURSE [file1 ...])
#根据指定的url下载文件
#timeout 超时时间;下载的状态会保留在status中;下载日志会被保存到log;sum指定所下载文件逾期的MD5值,如果指定会自动进行比对,
#如果不一致,则返回一个错误;SHOW_PROGRESS,进度信息会议状态信息的形式被打印出来
file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log] [EXPECTED_MD5 sun] [SHOW_PROGRESS])
#创建目录
file(MAKE_DIRECTORY [dir1 dir2 ...])
#会把path转换为以unix的/开头的cmake风格路径,保存在result中
file(TO_CMAKE_PATH path result)
#它会把cmake风格的路径转换为本地路径风格:windows下用"\",而unix下用"/"
file(TO_NATIVE_PATH path result)
#将会为所有匹配查询表达式的文件生成一个文件list,并将该list存储进变量variable里,如果一个表达式指定了RELATIVE,返回的结果将会相对于给定路径的相对路径,查询表达式例子:*.cxx,*.vt?
#NOTE:按照官方文档的说法,不建议使用file的GLOB指令来手机工程的源文件
file(GLOB variable [RELATIVE path] [globbing expressions]...)
11.设置某个路径的一种属性
prop1,prop2代表属性,取值为:INCLUDE_DIRECTORIES LINK_DIRECTORIES INCLUDE_REGULAR_EXPRESSION ADDITIONAL_MAKE_CLEAN_FILES
set_directory_properties(PROPERTIES prop1 value1 prop2 value2)
12.在给定的作用域内设置一个命名的属性,PROPERTY参数是必须的,第一个参数决定了属性可以影响的作用域:
GLOBAL: 全局作用域
DIRECTORY:默认当前路径,也可以用[dir]指定路径
TARGET:目标作用域,可以是0个活多个已有目标
SOURCE:源文件作用域,可以是0个活多个源文件
TEST:测试作用域,可以是0个或多个已有的测试
CACHE:必须指定0个或多个cache中已有的条目
set_property(<GLOBAL |DIRECTORY [dir] | TARGET [traget ...] | SOURCE [src1 ...] | TEST [test1 ...] | CACHE [entry1 ...]> [APPEND] PROPERTY<name> [value ...])