CMakeList文件详解

本篇为《网易云课堂》学习笔记

基础语法

    #设置参数
    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

  1. 添加一个库
* 添加库文件,名称为 
* 指定库类型:
    (1)STATIC:静态库
    (2)SHARED:动态库
    (3)MODULE:在dyld(苹果的链接库)有效,此环境为等效于 SHARED
* EXCLUDE_FROM_ALL:表示该库不会默认构建
* source1 source2 ... sourceN:用来指定库的源文件
    add_library(
        native-lib#添加的库
        SHARE#指定的库类型
        native-lib.cpp#指定库的源文件
    )
  1. 导入预编译库
  • 添加一个已经存在的预编译库
  • 一般需要配合 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( ${SRC_LIST})

  • 定义了这个工程会生成一个文件名为的可执行文件,相关的源文件是SRC_LIST中定义的源文件列表

target_link_libraries( 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  )
    
    #删除文件 等同于  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(
        
        [APPEND]
        PEOPERTY
        
        [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所在目录])

你可能感兴趣的:(CMakeList文件详解)