本篇为《网易云课堂》学习笔记
基础语法
#设置参数
set(var djasklfjksfkdsjf)
#打印消息
message("var = ${var}")
#设置列表
set(list_var 1 2 3 4 5)
message("list_var: ${list_var}")
#while循环
set(a "")
while (NOT a STREQUAL "xxx")
set(a "${a}x")
message("a = ${a}")
endwhile ()
#列表遍历
foreach (item 1 2 3)
message("item = ${item}")
endforeach (item)
#范围遍历
foreach (item RANGE 3)
message("item = ${item}")
endforeach (item)
#函数的使用(举例为3个参数)
fnction(func a b c)
message("a = ${a}")
message("b = ${b}")
message("c = ${c}")
#参数个数
message("ARGC = ${ARGC}")
#参数列表
message("ARGC = ${ARGV}")
#第一个参数
message("ARGC = ${ARGV0}")
#第二个参数
message("ARGC = ${ARGV1}")
#第三个参数
message("ARGC = ${ARGV2}")endfunction(func)
func(1 2 3)
常用命令
cmake_miniumum_required cmake(VERSION 3.4.1)
- 指定cmake最低支持的版本,
- 命令可选,但是如果使用了高版本特有的命令就需要指定最低版本
aux_source_directory(. DIR_SRCS)
- 第一个参数:查找目录
- 第二个目录:保存目录的变量
- 查找当前目录所有源文件,并将源文件名称保存到 DIR_SRCS 便变量
- 不能查找子目录
add_library
- 添加一个库
* 添加库文件,名称为 <name>
* 指定库类型:
(1)STATIC:静态库
(2)SHARED:动态库
(3)MODULE:在dyld(苹果的链接库)有效,此环境为等效于 SHARED
* EXCLUDE_FROM_ALL:表示该库不会默认构建
* source1 source2 ... sourceN:用来指定库的源文件
add_library(
native-lib#添加的库<name>
SHARE#指定的库类型
native-lib.cpp#指定库的源文件
)
- 导入预编译库
- 添加一个已经存在的预编译库 <name>
- 一般需要配合 set_target_properties 使用
add_library(
test
SHARED
IMPORTED#指定为导入的方式添加库
)
set_target_properties(
test#指明目标库名
PROPERTISE IMPORT_LOCATION#指明需要设置的参数
#ANDROID_ABI为Android二进制接口,适配不同cpu目录
${库路径}/${ANDROID_ABI}/libtest.so#参数的值(此处为路径)
)
-set
- 设置CMAK变量
# 设置 可执行文件(全局变量:EXECUTABLE_OUTPUT_PATH) 的输出路径
set(EXECUTABLE_OUTPUT_PATH [output_path])
# 设置 库文件(全局变量:LIBRARY_OUTPUT_PATH) 的输出路径
set(LIBRARY_OUTPUT_PATH [output_path])
#设置C++编译参数(全局变量:CMAKE_CXX_FLAGS)
set(CMAKE_CXX_FLAGS "-Wall std=c++11")
# 设置源文件集合(SOURCE_FILES 为本地变量不用记忆,此处为展示)
set(SOURCE_FILES main.cpp test.cpp ...)
include_directories
- 设置头文件目录
- 相当于g++中的 -I 参数
#可以使用路径和参数两种形式
include_directories(./include ${MY_INCLUDE})
add_executable(<name> ${SRC_LIST})
- 定义了这个工程会生成一个文件名为<name>的可执行文件,相关的源文件是SRC_LIST中定义的源文件列表
target_link_libraries(<name> lib1 lib2 lib3)
- <>为目标库的名称
- 将若干库连接到目标库文件
- 链接的顺序需要按照 gcc 链接顺序规则,被链接的库放在依赖它的库的后面
如标题:lib1依赖于lib2,lib2依赖于lib3,所以书写顺序为lib1 lib2 lib3
add_definitions(-DFOO -DDEBUG)
- 为当前目录以及子目录的源文件加入 -D引入的define flag
add_subdirectory
- 如果当前目录包含子目录时可以使用add_subdirectory,子目录中也需要包含有CMakeLists.txt
# sub_dir 指定包含CMakeList.txt 和源码的子文件目录
#binary_dir 是输出路径,一般可以不指定
add_subdirectory(sub_dir [binary_dir])
file
- 文件操作指令
#将message写入到filename文件中,会覆盖文件原有内容
file(WRITE filename "message")
#将message写入到filename文件中,会追加在文件末尾
file(APPEND filename "message")
#从filename文件中读取内容存储到 var 中
#[LIMIT numBytes] 为读取的字节数上线
#[OFFSET offset] 为读取开始位置
#[HEX] 指定内容以十六进制形式写入 var
file(READ filename var [LIMIT numBytes] [OFFSET offset] [HEX])
#重命名文件
file(RENAME <oldname> <newname>)
#删除文件 等同于 rm
file(REMOVE [filel ...])
#递归的删除文件 等同于 rm -r
file(REMOVE_RECURSE [filel ...])
# 根据指定 url 下载文件(输入参数)
# timeout 超时时间 (输入参数)
# status 用来保存下载状态 (保存输出参数)
# log 用来保存下载日志 (保存输出参数)
# md5 用来校验,如果指定了 md5会自动进行校验,不一致会返回一个错误(输入参数)
# SHOW_PEOGRESS 打印显示进度信息(输入参数)
file(DOWNLOAD url file
[TIMEOUT timeout]
[STATUS status]
[LOG log]
[EXPECUTED_MD5 md]
[SHOW_PROGRESS])
#创建目录
file(MAKE_DIRECTORY [dir1 dir2 ...])
#将 path 转换为 unix 的风格,保存在 result
file(TO_CMAKE_PATH path result)
#将 path 转换为 当前系统 的风格,保存在 result:window使用“\”;unix使用"/"
file(TO_NATIVE_PATH path result)
#将所有匹配查询表达式 [globbing expression] 的文件生成一个list
# var 存储查询结果 list
# 指定[RELATIVE path] 则查询结果为于 path 的相对路径
file(GLOB var [RELATIVE path] [globbing expression]...)
set_directory_properties(PROPERTIES pro1 var1 pro2 var2)
- 设置某个路径的一种属性
- pro 指代属性,var 为属性的设置值
- pro可选值如下:
INCLUDE_DIRECTORIES
LINK_DIRECTORIES
INCLUDE_REGULAR_EXPRESSION
ADDITIONAL_MAKE_CLEANFILES
set_propetry
- 在规定的作用域设置一个命名属性
- PROGPERTY 是必须的
- 第一个参数为属性影响范围
GLOBAL :全局
DIRECTORY [dir...]:默认为当前目录,也可以用[dir]指定
TARGET [target...] :指定作用域
SOUCES [src...] :指定源文件
TEST [test...] :指定测试作用域
CACHE [ent...] :指定cache中已有的条目
set_propertry(
<GLOBAL | TARGET [target...] | SOUCES [src...] | TEST [test...] | CACHE [ent...]>
[APPEND]
PEOPERTY
<name>
[value...]
)
注意事项汇总
添加预编译库(Android6.0之后)
上面使用add_library()
+ set_target_properties()
的方式导入库(详见add_library)。
这个方式在Android6.0之后的使用会有问题,替换为一下方式
# 使用 -set 命令 修改 flag 变量,在变量后追加 -L+dir
# c文件使用 CMAKE_C_FLAGS c++文件使用CMAKE_CXX_FLAGS
# -L 为库的查找命令
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -L[SO所在目录])
网友评论