• CMake入门以及学习笔记


    使用cef3替代chromium内核开发产品过程中,第一次接触到系统构建,使用了最常见的CMake。CMake虽然在构建系统中用的比较多,但是使用到的程序员还是很少的。现在在国内能找到的相关资料和博客比较多,本人在学习中也看了很多人的博客,比如 CMake学习(一)  , CMake语法之流程控制 等。再次感谢这些作者的分享。下边提供一些系统学习的资料。

    CMake的官网地址:http://www.cmake.org/

    CMake主要的文档《learning_cmake》 《CMake Practice》,这个百度上搜索一下,很容易下载到。

    学习CMake之前,借用下 《CMake Practice》中的一段话,如果你的情况符合以下几条就不要浪费时间在CMake上。

    1,如果你没有实际的项目需求,那么看到这里就可以停下来了,因为cmake的学习过程就是实践过程,没有实践,读的再多几天后也会忘记。
    2,如果你的工程只有几个文件,直接编写Makefile是最好的选择。
    3,如果使用的是C/C++/Java之外的语言,请不要使用cmake(至少目前是这样)。
    4,如果你使用的语言有非常完备的构建体系,比如java的ant,也不需要学习cmake,虽然有成功的例子,比如QT4.3的csharp绑定qyoto。
    5,如果项目已经采用了非常完备的工程管理工具,并且不存在维护问题,没有必要迁移到cmake。
    6,如果仅仅使用qt编程,没有必要使用cmake,因为qmake管理Qt工程的专业性和自动化程度比cmake要高很多。

    学习CMake之前,最好能找到一个比较简单地例子对照教程看,并且一开始编写一些简单地例子。这样不仅能学得快,也容易建立学习的自信。

    下边主要讲三点,也是最常用到的三点。

    一、CMake常用命令:

    CMakelist中,命令名字是不区分大小写的,而参数和变量是大小写相关的。

    CMake中使用"#"表示注释该行代码。

    命令:

    与其他语言编程语言不同的是,CMake脚本的语法中没有赋值操作,无论是赋值,还是比较、判断操作,都是通过内置命令来完成的,例如"set(),math()等"。所有的内置命令调用形式为:

    command(arg1 arg2 arg3 ... argn)

    每个参数均以空格,或者分号分割。注:不建议使用分号分割参数.

    message():显示一个消息。如message("Hello world");

    cmake_minimum_required():需要的最低版本; cmake_minimum_required(version 2.6)  

    project():项目的名称 如project(hello)

    set():Cmake中的赋值操作都是通过这个来做的。如 SET(HELLO_SRCS  Hello.c Hello.cpp  world.c   world.cpp)

    add_definitions():设置编译选项;

    subdirs:CMake 是以递归的方式工作;处理完当前目录,再去 SUBDIRS 中的目录

    add_library :生成一个链接库;

    add_executable:添加生成文件;如:ADD_EXECUTABLE (Hello ${HELLO_SRCS})

    add_dependencies:包含一个依赖库文件夹;

    add_subdirectory:向当前工程添加存放源文件的子目录;

    aux_source_directory :不在当前目录下的其他地方的源文件;

    include_directories:  指明文件所在路径;

    set_target_properties:设置文件为另外一个名字。set_target_properties(libhello PROPERTIES OUTPUT_NAME "hello")

    source_group:当文件都在同一个路径下面使用

    二、CMake变量以及变量的引用

        CMake中的变量无需声明,并且没有类型概念,这一点类似于python;变量可以认为都是全局的,哪怕在一个宏中定义的变量,也可以在宏的外面被访问到;所有的变量都是一个列表变量,下文在举例时会详细说明这一点;CMake对于变量是大小写敏感的。

        在CMake中,有两种引用方式:对于变量值的引用,和直接引用这个变量本身,使用方式分别是:${varName} 和 varName。

    三、CMake的宏与函数

        同大多数脚本语言一样,CMake中也有宏和函数的概念,关键字分别为"macro"和"function",具体用法如下:

    # 宏

    macro( [arg1 [arg2 [arg3 ...]]])

         COMMAND1(ARGS ...)

         COMMAND2(ARGS ...)

         ...

    endmacro()
     

    # 函数

    function( [arg1 [arg2 [arg3 ...]]])

         COMMAND1(ARGS ...)

         COMMAND2(ARGS ...)

         ...

    endfunction()

    以简单的求和函数为例,我们来看宏的一个示例:

    macro(sum outvar)

         set(_args ${ARGN})

         set(result 0)

         foreach(_var ${_args})

             math(EXPR result "${result}+${_var}")

         endforeach()

         set(${outvar} ${result})

    endmacro()

    sum(addResult 1 2 3 4 5)

    message("Result is :${addResult}")

        上面是一段求和宏定义,我们来解读一下代码:"${ARGN}"是CMake中的一个变量,指代宏中传入的多余参数。因为我们这个宏sum中只定义了一个 参数"outvar",其余需要求和的数字都是不定形式传入的,所以需要先将多余的参数传入一个单独的变量中。当然,在这个示例中,第一行代码显得多余, 因为似乎没必要将额外参数单独放在一个变量中,但是建议这么做。对上面这个宏再进一步加强:如果我们想限制这个宏中传入的参数数目(尽管在这个宏中实际上 是不必要的),那么可以将宏改写一下:

    macro(sum outvar)

         set(_args ${ARGN})

         list(LENGTH _args argLength)

         if(NOT argLength LESS 4) # 限制不能超过4个数字

             message(FATAL_ERROR "to much args!")

         endif()

         set(result 0)

         foreach(_var ${ARGN})

             math(EXPR result "${result}+${_var}")

         endforeach()

         set(${outvar} ${result})

    endmacro()

    sum(addResult 1 2 3 4 5)

    message("Result is :${addResult}")

        而CMake中的函数("function")与宏唯一的区别就在于,函数不能像宏那样将计算结果传出来(也不是完全不能,只是复杂一些),并且函数中的变量是局部的,而宏中的变量在外面也可以被访问到,请看下例:

    macro(macroTest)

         set(test1 "aaa")

    endmacro()

    function(funTest)

         set(test2 "bbb")

    endfunction()

    macroTest()

    message("${test1}")

    funTest()

    message("${test2}")

    运行这段代码后,只会打印出一条信息"aaa",由此可以看到宏与函数的区别

    言必信,行必果。欢迎访问我的博客。
  • 相关阅读:
    ios 中的循环引用问题及解决
    Leetcode-Maximum Depth of Binary Tree
    Leetcode-Min Stack
    Leetcode-Intersection of Two Linked Lists
    Leetcode-Binary Tree Inorder Traversal
    Leetcode-Unique Binary Search Trees II
    Leetcode-Unique Binary Search Trees
    Leetcode-binary Tree Zigzag Level Order Traversal
    Leetcode-Construct Binary Tree from inorder and preorder travesal
    Leetcode-Next Permutation
  • 原文地址:https://www.cnblogs.com/guolixiucai/p/4681171.html
Copyright © 2020-2023  润新知