Android cmake命令总结以及脚本模板

常用cmake命令记录及Cmake脚本模板(对付日常开发几乎已经够用了)

指令总结方面可以直接查看这个官方链接:cmake.org/cmake/help/…

这里总结一些常用的命令及使用示例:

  • set

    • set (<variable> <value>... [PARENT_SCOPE])

      设置某个变量的值,作用域为当前函数或者当前文件夹,[PARENT_SCOPE]这个参数没用过,参照官方文档可知似乎是将此变量设置在上一级作用域中(也就是父目录或者调用函数)

      使用变量的方法:${}

  • file

    • file(WRITE <filename> <content>...)

      将content写入指定文件,如果文件不存在则创建文件;如果文件存在则覆盖该文件

      示例:file(WRITE src/hello.txt "hello world")

    • file(APPEND <filename> <content>...)

      示例:file(APPEND src/hello.txt "hello world 2")

      将content以追加的形式写入指定文件

    • file(READ <filename> <variable> [OFFSET <offset>][LIMIT <max-in>] [HEX])

      <filename>文件里面的内容从偏移为<offset>的地方最多读取<max-in>个内容,并放入<variable>进行保存,HEX选项为16进制读取。

      示例:file(READ src/hello.txt context LIMIT 5)

    • file(GLOB <variable> [LIST_DIRECTORIES true|false] [RELATIVE <path>] [<globbing-expressions>...]) 生成<globbing-expressions>与之匹配的文件列表并将其存储到<variable>。Globbing表达式与正则表达式类似,但更简单。如果RELATIVE指定了flag,则结果将作为给定路径的相对路径返回。

      默认情况下列出GLOB目录 - 如果LIST_DIRECTORIES设置为false,则在结果中省略目录 。

      示例:file(GLOB utils_src_cc src/utils/*.cc)

  • find_library()

    • find_library (<VAR> name1 [path1 path2 ...])

      此命令用于查找库。创建名为<VAR>的缓存条目以存储此命令的结果。如果找到库,则结果存储在变量中,除非清除变量,否则不会重复搜索。如果找不到任何结果,结果将是<VAR>-NOTFOUND,并在下次使用相同变量调用find_library时再次尝试搜索。搜索的库的名称由name1指定(值为库的名称,如libz.a,则name值为z)。可以在PATHS参数之后指定其他搜索位置。

      示例:find_library( log-lib log)

  • add_library()

    使用指定的源文件将库添加到项目中。

    • add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...])

      添加一个根据命令调用中列出的源文件,构建名为<name>的库目标。它<name>对应于逻辑目标名称,并且在项目中必须是全局唯一的。构建的库的实际文件名是基于本机平台(例如lib.a or .lib)的约定构造的。

      示例:

      add_library(
              ${PROJECT_NAME}
      
              SHARED
      
              ${src1} //可以配合file命令,但官方不建议这么做,理由是cmake无法知晓有新的文件加入
              ${src2}
              ${src3}
              )
      复制代码
    • add_library(<name> <SHARED|STATIC|MODULE|UNKNOWN> IMPORTED [GLOBAL])

      导入名字为<name>的库

      示例:

      add_library(myz SHARED IMPORTED)
      add_library(myz SHARED IMPORTED)
      #设置库文件所在路径
      set_target_properties(myz PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/libs/${ANDROID_ABI}/libnative-static.a)
      复制代码
  • target_link_libraries()

    • target_link_libraries( ... ... ...)

      默认情况下,使用此签名,库依赖项是可传递的。当此目标链接到另一个目标时,链接到此目标的库也将出现在另一个目标的链接行上。这个传递性的“链接接口”存储在INTERFACE_LINK_LIBRARIES目标属性,可以通过直接设置属性来覆盖。

      示例:target_link_libraries(${PROJECT_NAME} ${log-lib} ${z-lib})

  • include_directories()

    • include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

      将给定目录添加到编译器用于搜索包含文件的目录中。相对路径被解释为相对于当前源目录。include目录被添加到当前CMakeLists文件的目录属性 INCLUDE_DIRECTORIES 之中。他们对当前CMakeLists文件中INCLUDE_DIRECTORIES属性中也加入了每个目标的目标属性。目标属性值是生成器使用的值。

    示例:

    include_directories(
            src/dir1
            src/dir2
            src/dir3
            src/dir4
            )
    复制代码
  • 两个Cmakelists.txt的例子:

    • 第一个

      cmake_minimum_required(VERSION 3.4.1)
      
      set(PROJECT_NAME AMLLOC)
      
      file(WRITE amlloc/hello.txt "asdasda")
      file(READ amlloc/hello.txt context LIMIT 5)
      file(APPEND amlloc/hello.txt ${context})
      
      file(GLOB amlloc_src amlloc/src/*.cpp)
      file(GLOB utils1_src_cc amlloc/src/utils/*.cc)
      file(GLOB utils2_src amlloc/src/utils2/*.cpp)
      file(GLOB utils3_src_cc amlloc/src/utils3/*/*.cc)
      file(GLOB utils3_src_c amlloc/src/utils4/*/*.c)
      file(GLOB utils4_src amlloc/src/utils5/*.c)
      
      
      
      find_library( log-lib log)
      find_library( z-lib z)
      
      include_directories(
              amlloc/src/utils/include
              amlloc/src/include
              amlloc/src/utils1
              amlloc/src/utils2/md5
              amlloc/src/utils2
              amlloc/src/utils3
              )
      
      
      
      add_library(
              ${PROJECT_NAME}
      
              SHARED
      
              ${amlloc_src}
              ${utils1_src_cc}
              ${utils2_src}
              ${utils3_src_cc}
              ${utils3_src_c}
              ${utils4_src}
              )
      target_link_libraries(${PROJECT_NAME}  ${log-lib} ${z-lib})
      复制代码
    • 第二个

      首先看Project的目录结构

      ├── CMakeLists.txt
      ├── main.cpp
      └── module
          ├── CMakeLists.txt
          ├── GameSave.h
          ├── s_utils.cc
          ├── s_utils.h
          ├── log.cc
          ├── log.h
          ├── utils.cc
          └── utils.h
      复制代码

      子目录:

      set(PROJECT_NAME module_demo)
      file(GLOB module_src ./*.cc)
      
      add_library(${PROJECT_NAME} SHARED ${module_src})
      find_library(log-lib log)
      target_link_libraries(${PROJECT_NAME}  ${log-lib})
      复制代码

      父目录:

      cmake_minimum_required(VERSION 3.4.1)
      
      #find library log and the result is stored
      #in the var log-lib
      find_library(log-lib log)
      
      #get the .so directory
      set(DISTRIBUTION_DIR ${CMAKE_SOURCE_DIR}/../../../libs)
      
      add_library(gamesavesaty_module SHARED IMPORTED)
      
      set_target_properties(gamesavesaty_module
                            PROPERTIES IMPORTED_LOCATION
                            ${DISTRIBUTION_DIR}/armeabi/libmodule.so
                            )
      
      add_library(gamesavety SHARED IMPORTED)
      
      set_target_properties(gamesavety
                            PROPERTIES IMPORTED_LOCATION
                            ${DISTRIBUTION_DIR}/armeabi/libgamesavety.so
                            )
      
      
      
      #set c++ compiler
      set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
      
      set(PROJECT_NAME demo)
      
      
      #include the module header file
      include_directories(./module)
      
      #add source file in module
      add_subdirectory(module)
      
      #Adds a library target called PROJECT_NAME to be built
      #from the source file main.cpp and files in module.
      add_library(${PROJECT_NAME} SHARED main.cpp)
      
      include_directories(${DISTRIBUTION_DIR}/armeabi)
      
      #Specify libraries module_demo and log-lib to
      #use when linking project demo.
      target_link_libraries(${PROJECT_NAME} module_demo gamesavety gamesavesaty_module ${log-lib})
      复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
android make 介绍 Make 文件说明 整个 Build 系统的入口文件是源码树根目录下名称为“Makefile”的文件,当在源代码根目录上调用 make 命令 时,make 命令首先将读取该文件。 Makefile 文件的内容只有一行:“include build/core/main.mk”。该行代码的作用很明显:包含 build/core/main.mk 文 件。在 main.mk 文件中又会包含其他的文件,其他文件中又会包含更多的文件,这样就引入了整个 Build 系统。 这些 Make 文件间的包含关系是相当复杂的,图 3 描述了这种关系,该图中黄色标记的文件(且除了 $开头的文件) 都位于 build/core/ 目录下。 Android 源码中包含了许多的模块,模块的类型有很多种,例如:Java 库,C/C++ 库,APK 应用,以及可执行文件 等 。并且,Java 或者 C/C++ 库还可以分为静态的或者动态的,库或可执行文件既可能是针对设备(本文的“设备”指 的是 Android 系统将被安装的设备,例如某个型号的手机或平板)的也可能是针对主机(本文的“主机”指的是开发 Android 系统的机器,例如装有 Ubuntu 操作系统的 PC 机或装有 MacOS 的 iMac 或 Macbook)的。不同类型的模块 的编译步骤和方法是不一样,为了能够一致且方便的执行各种类型模块的编译,在 config.mk 中定义了许多的常量, 这其中的每个常量描述了一种类型模块的编译方式,这些常量有: BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk BUILD_PHONY_PACKAGE:= $(BUILD_SYSTEM)/phony_package.mk BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk BUILD_HOST_

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值