CMake语法学习笔记

标签: cmake NDK CMakeLists
1043人阅读 评论(0) 收藏 举报
分类:

最近一直在忙新需求,本来想记录一下自己学CMake的一些笔记,拖到了现在……

一、CMakeLists.txt文件

  • 如果工程存在多个目录,需要确保每个要管理的目录都存在一个CMakeLists.txt文件,这是CMake的构建定义文件。

二、CMake的基本语法规则

  • CMake的基本语法规则:指令(参数1 参数2 …),其中参数使用括号括起,参数之间使用空格或分号隔开。
  • 指令与大小写无关的,参数和变量是大小写相关的。

三、CMake常用指令

  • project(projectname [CXX][C][Java])
    用来定义工程名称,并指定工程支持的语言,支持的语言列表可忽略不写,默认支持所有语言。
    例如:

    //定义bzip2工程目录
    project(bzip2)
  • set(var [value])
    用来显示地定义变量,有多个变量用空格或分号隔开。
    例如:

    //定义变量FILE_PATH,用来储存两个文件路径
    set(FILE_PATH C:\\cpp\\\main.c C:\\cpp\\bspatch.c)

    注:
    1.当我们需要用到这个变量FILE_PATH时,可以采用var{FILE_PATH}
    2.在IF控制语句中是直接使用变量名的,无需${}

  • cmake_minimun_required(VERSION 3.4.1)
    用来指定CMake的最低版本为3.4.1

  • aux_source_directory(dir variable)
    将dir目录下的所有源代码文件的名字保存在变量variable中。
    例如:

    //将当前目录下的源代码名字保存在DIR_SRCS变量中
    aux_source_directory(. DIR_SRCS)
  • target_link_libraries(target library1 library2 …)
    指定target需要链接的library,这里的target必须已经被创建。
    例如:

    //指定main工程需要链接hello共享库或so文件
    target_link_libraries(main hello)
    //或者:
    target_link_libraries(main libhello.so)
  • add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
    用于向当前工程添加一个需要进行构建的子目录,并且可以指定中间二进制文件和目标二进制文件存放的位置。
    例如:

    //当执行到该指令时,会进入到bzip2目录执行此目录的CMakeLists.txt文件
    add_subdirectory(bzip2)
  • add_library(name [SHARED | STATIC | MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)
    将一组源文件source1 source2 … sourceN编译出一个库文件,并且保存为libname.so文件(在此不需写全libname,只需填写name即可,CMake会自动为你生成libname.so)。
    其中SHARED表示动态库,在代码中使用loadLibrary动态调用;STATIC表示静态库,集成到代码中会在编译时调用;MODULE只有在使用dyld的系统有效,如果不支持dyld,则被当作SHARED对待。
    EXCLUDE_FROM_ALL表示这个库不被默认构建,除非有其他组件依赖或手工构建。
    例如:

    //将bspatch.c编译为一个名为libbspatch.so的共享库
    add_library(bspatch SHARED bspatch.c)

    add_library命令也可以用来创建导入的库目标。

    add_library(<name> <SHARED|STATIC|MODULE|UNKNOWN> IMPORTED)

    导入的库目标是引用了在工程外的一个库文件的目标。没有生成构建这个库的规则。这个目标名字的作用域在它被创建的路径及以下有效。它可以向任何在该工程内构建的目标一样被引用。导入库为类似于target_link_libraries命令中引用它提供了便利。关于导入库细节可以通过指定那些以IMPORTED_的属性设置来指定。其中最重要的属性是IMPORTED_LOCATION(以及它的具体配置版本,**IMPORTED_LOCATION**_),它指定了主库文件在磁盘上的位置。

  • find_library(variable name1 path1 path2 …)
    查找库文件name1的全路径(包含库文件名),如果找到将路径保存在变量variable中,如果没有找到则结果为variable_NOT_FOUND。
    例如:

    //将log库文件路径保存在变量log_lib中,并将bspatch工程链接引入log库
    find_library(log_lib log)
    target_link_libraries(bspatch ${log_lib})
  • set_target_properties(target1 target2 … PRORERTIES prop1 value1 prop2 value2 …)
    用来设置输出的名称。
    例如:

    //导入libavutil-55.so库文件
    add_library(avutil-55 SHARED IMPORTED)
    //设置需要引用的libavutil-55.so库文件路径,其中IMPORTED_LOCATION库文件在磁盘上的位置
    set_target_properties(avutil-55 PROPERTIES IMPORTED_LOCATION ../libs/armeabi-v7a/libavutil-55.so)

四、CMake常用变量

一般来说,我们可以用set指令显示定义一个变量,但CMake系统已经帮我们隐式预定义了一些变量,可以采用${VAR}方式来调用这些变量,以下记录一些Android CMakeLists.txt文件中常用的变量。

  • PROJECT_SOURCE_DIR
    当前工程的源码路径。

  • PROJECT_BINARY_DIR
    指向工程构建目录的全路径。

  • CMAKE_VERSION
    CMake的完整版本号;格式为major.minor.patch[.tweak[-id]]

  • CMAKE_CURRENT_SOURCE_DIR
    调用这个变量的CMakeLists.txt所在路径

  • CMAKE_CURRENT_LIST_FILE
    调用这个变量的CMakeLists.txt的完整路径

  • CMAKE_CURRENT_LIST_LINE
    这个变量所在的行数

  • PROJECT_NAME
    返回通过project指令定义的项目名称


  • 以上只是最近学NDK总结出的小部分CMake知识点,对于真正使用CMake的人来说,犹如大海里的一根针般渺小,勿喷

真正想了解CMake构建工具的朋友,可以参看以下链接:

1.CMake手册详解:http://www.cnblogs.com/coderfenghc/tag/cmake/
2.CMake实践:http://pan.baidu.com/s/1jI2RWqE


查看评论

从零开始学Swift——语法篇 第一季

本视频主要介绍Swift程序开发环境、Swift 语法基础、运算符、Swift原生数据类型、Swift原生字符串、控制语句。本视频是基 于Swift2.x版本录制,与图书《从零开始学Swift》语法篇同步讲解。是学习Swift视频,进行iOS开发的必备知识。代码下载地址 http://51work6.com/swiftbook1.php
  • 2016年03月25日 13:16

cmake使用一 —— cmake语法

cmake语法 康 林(译) 2012-04-28   Cmake是一个用于生成交叉平台编译工程的工具。它类似autoconf。它产生你所选择的编译环境的本地makefile和workspac...
  • kl222
  • kl222
  • 2012-04-28 11:26:37
  • 15254

Cmake 模板和语法

开始一直犹豫是不是要学cmake对于一个没有项目驱动的人来数,感觉用不用都可以。我大可用一个简单的Makefile模板来做一些简单的工程阿。或者我还可以用autotools等。 不过既然已经看了一个...
  • feibuhui123
  • feibuhui123
  • 2013-01-29 16:08:04
  • 6619

cmake使用示例与整理总结

本文源码托管于github上cmake_demo cmake中一些预定义变量 PROJECT_SOURCE_DIR 工程的根目录PROJECT_BINARY_DIR 运行cmake命令的目录,通...
  • wzzfeitian
  • wzzfeitian
  • 2014-11-10 00:37:48
  • 108945

cmake 基本语法

简单的语法 注释 # 我是注释 命令语法 COMMAND(参数1 参数2 ...) 字符串列表 A;B;C # 分号分割或空格分隔的值 变量(字符串或字符串列表)set(...
  • farmwang
  • farmwang
  • 2017-12-15 11:49:19
  • 81

cmake语法小结

cmake小结: CMakeLists.txt 文件中不区分大小写 PROJECT(project_name) 定义工程名称语法:project(projectname [cxx] [c] [j...
  • liukang325
  • liukang325
  • 2016-08-16 15:56:25
  • 871

Android中CMake的使用之二具体的使用细节

Android中CMake的使用之二具体的使用细节 在上一节中提供了一个最简单的使用说明,但是在实际情况中,一般来说,应用程序中对C++的控制代码会安排在一个或几个专门的JAVA类中。同样,接口函数...
  • fpcc
  • fpcc
  • 2017-04-10 09:45:09
  • 894

<em>cmake语法</em>简单教程

<em>CMake</em>是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。<em>cmake</em>编写规则,<em>cmake</em>简单教程.
  • 2018年03月14日 00:00

cmake语法及简单的cmake例子

1.概念 out-of-source build,与in-source build相对,即将编译输出文件与源文件放到不同目录中 2.基本结构     1,依赖CMakeLists.txt文件,项...
  • zhangwenbo7912
  • zhangwenbo7912
  • 2013-04-06 20:12:36
  • 1718

CMake 基本语法(Mastering CMake 笔记)

CMake语法CMakeLists文件是由注释、命令以及空白符三种语法组成。注释是由符号#开始直到一行结束。命令是由命令名称、括号以及由空白符分隔的参数组成。除了用于分隔空命令参数的空白符,其他的空白...
  • lixiang19910909
  • lixiang19910909
  • 2017-09-30 14:28:20
  • 232
    个人资料
    持之以恒
    等级:
    访问量: 20万+
    积分: 2802
    排名: 1万+
    最新评论