关闭

CMake语法学习笔记

标签: cmakeNDKCMakeLists
864人阅读 评论(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


0
0
查看评论

cmake使用一 —— cmake语法

cmake语法 康 林(译) 2012-04-28   Cmake是一个用于生成交叉平台编译工程的工具。它类似autoconf。它产生你所选择的编译环境的本地makefile和workspaces。   英文原文地址:http://www.cmake.org...
  • kl222
  • kl222
  • 2012-04-28 11:26
  • 14438

cmake使用示例与整理总结

本文源码托管于github上cmake_demo cmake中一些预定义变量 PROJECT_SOURCE_DIR 工程的根目录PROJECT_BINARY_DIR 运行cmake命令的目录,通常是${PROJECT_SOURCE_DIR}/buildCMAKE_INCLUDE_PATH 环境...
  • wzzfeitian
  • wzzfeitian
  • 2014-11-10 00:37
  • 101877

Cmake 模板和语法

开始一直犹豫是不是要学cmake对于一个没有项目驱动的人来数,感觉用不用都可以。我大可用一个简单的Makefile模板来做一些简单的工程阿。或者我还可以用autotools等。 不过既然已经看了一个晚上了,还是把它弄懂点吧,记得曾经用过automake,好像没有弄到自己感觉满意就放下了。现在这个c...
  • feibuhui123
  • feibuhui123
  • 2013-01-29 16:08
  • 6434

CMakeLists入门学习笔记

因为在使用OPENCV以及caffe的过程中都接触到了许多关于CMake的使用,于是就想了解一下CMake究竟是怎样一个东西,有什么作用。顺便做一个学习笔记。 本文参考《CMake Practice》这篇文章完成,旨在指导用户快速使用CMake,如果需要更详细的内容,请通读《CMake Pract...
  • Lee_J_R
  • Lee_J_R
  • 2017-03-08 15:44
  • 3529

cmake语法小结

cmake小结: CMakeLists.txt 文件中不区分大小写 PROJECT(project_name) 定义工程名称语法:project(projectname [cxx] [c] [java])可以指定工程采用的语言,选项分别表示:C++, C, java, 如不指定默认支持所有语言...
  • liukang325
  • liukang325
  • 2016-08-16 15:56
  • 757

cmake 常用变量、常用环境变量、常用语法总结

一,cmake 变量引用的方式: 前面我们已经提到了,使用${}进行变量的引用。在 IF 等语句中,是直接使用变量名而不通过${}取值 二,cmake 自定义变量的方式: 主要有隐式定义和显式定义两种,前面举了一个隐式定义的例子,就是 PROJECT 指令,他会隐式的定义_BINARY_DIR 和...
  • bytxl
  • bytxl
  • 2016-02-04 14:27
  • 3264

cmake使用示例与整理总结

转自:http://blog.csdn.net/wzzfeitian/article/details/40963457/ 本文代码托管于github  cmake_demo cmake中一些预定义变量 PROJECT_SOURCE_DIR 工程的根目录PROJEC...
  • sherry_gp
  • sherry_gp
  • 2016-03-12 14:21
  • 1181

cmake使用示例与整理总结

转载地址:http://blog.csdn.net/wzzfeitian/article/details/40963457/ 本文代码托管于github  cmake_demo cmake中一些预定义变量 PROJECT_SOURCE_DIR 工程的根...
  • shitsnail
  • shitsnail
  • 2016-11-24 11:33
  • 1293

cmake 学习笔记(六)

希望这是现阶段阻碍阅读shiboken和PySide源码的涉及cmake的最后一个障碍 ^ _^ 学习 cmake 的单元测试部分 ctest。 简单使用 最简单的使用ctest的方法,就是在 CMakeLists.txt 添加命令: enable_testing()
  • dbzhang800
  • dbzhang800
  • 2011-04-22 15:12
  • 6878

CMake学习笔记(二)——CMake语法

CMake学习笔记(二)——CMake语法
  • ajianyingxiaoqinghan
  • ajianyingxiaoqinghan
  • 2017-04-18 17:46
  • 359
    个人资料
    • 访问:189170次
    • 积分:2650
    • 等级:
    • 排名:第16223名
    • 原创:73篇
    • 转载:16篇
    • 译文:0篇
    • 评论:81条
    最新评论