美文网首页
CMakeList文件详解

CMakeList文件详解

作者: 总是一点点 | 来源:发表于2020-01-03 17:31 被阅读0次

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

    基础语法

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

    相关文章

      网友评论

          本文标题:CMakeList文件详解

          本文链接:https://www.haomeiwen.com/subject/gwftactx.html