常用的 CMake 指令总结

本文总结了CMake的几个关键指令,包括cmake_minimum_required设置项目所需的CMake版本,include_directories添加头文件目录,add_library用于创建静态或动态库,set_target_properties用于设置目标编译属性,find_library查找库文件,以及target_link_libraries将目标文件与库文件链接。这些指令在Android NDK和JNI开发中尤为常见。

CMamke 的官方文档:https://cmake.org/cmake/help/v3.0/manual/cmake-commands.7.html

1. cmake_minimum_required

设置 CMake 项目要求的最低的版本:

cmake_minimum_required(VERSION major[.minor[.patch[.tweak]]]
                       [FATAL_ERROR])

比如,

cmake_minimum_required(VERSION 3.4.1)
2. include_directories

添加 include 文件的目录:

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

比如,

include_directories(opencv/jni/include src/main/cpp/include)
3. add_library

添加库到项目中,可指定库的名称,及其源码位置:

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            source1 [source2 ...])
  1. 添加库和源代码到项目中,库的名称通过 <name> 指定,并且应该是全局唯一的。
  2. STATIC, SHARED 和 MODULE 代表库的创建方式。STATIC 库是目标文件的归档文件,在链接其它目标的时候使用;SHARED 表示在运行时动态链接;MODULE 表示不会链接到其他项目,但是可能在运行时动态加载。默认是 STATIC 或者 SHARED 的,这取决于 BUILD_SHARED_LIBS。

第二种调用方式,用来加载项目之外的库文件。这个目标名字的作用域在它被创建的路径及以下有效,但可以通过 GLOBAL 拓展。关于导入库细节可以通过指定那些以 IMPORTED_ 的属性设置来指定。其中最重要的属性是 IMPORTED_LOCATION(以及它的具体配置版本,IMPORTED_LOCATION_<CONFIG>),它指定了主库文件在磁盘上的位置。

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

此外,还有几种其他的调用方式:

add_library(<name> OBJECT <src>...)
add_library(<name> ALIAS <target>)
add_library(<name> INTERFACE [IMPORTED [GLOBAL]])

示例,

add_library(opencv_calib3d STATIC IMPORTED)
add_library(my_cropper SHARED src/main/cpp/img_proc.cpp)
4. set_target_properties

用来为目标设置编译属性:

set_target_properties(target1 target2 ...
                      PROPERTIES prop1 value1
                      prop2 value2 ...)

比如,下面的指令用来指定目标在磁盘上面的目录:

set_target_properties(opencv_calib3d PROPERTIES IMPORTED_LOCATION ${PROJECT_SOURCE_DIR}/opencv/libs/${ANDROID_ABI}/libopencv_calib3d.a)
5. find_library

用来查找库。

# 简化版本
find_library (<VAR> name1 [path1 path2 ...])

# 一般版本
find_library (
          <VAR>
          name | NAMES name1 [name2 ...] [NAMES_PER_DIR]
          [HINTS path1 [path2 ... ENV var]]
          [PATHS path1 [path2 ... ENV var]]
          [PATH_SUFFIXES suffix1 [suffix2 ...]]
          [DOC "cache documentation string"]
          [NO_DEFAULT_PATH]
          [NO_CMAKE_ENVIRONMENT_PATH]
          [NO_CMAKE_PATH]
          [NO_SYSTEM_ENVIRONMENT_PATH]
          [NO_CMAKE_SYSTEM_PATH]
          [CMAKE_FIND_ROOT_PATH_BOTH |
           ONLY_CMAKE_FIND_ROOT_PATH |
           NO_CMAKE_FIND_ROOT_PATH]
         )
6. target_link_libraries

该指令的作用为将目标文件与库文件进行链接:

target_link_libraries(<target> [item1] [item2] [...]
                      [[debug|optimized|general] <item>] ...)

上述指令中的 <target> 是指通过 add_executable()add_library() 指令生成已经创建的目标文件,而 [item] 表示库文件没有后缀的名字。

比如,

target_link_libraries(
        my_cropper
        opencv_stitching)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值