Android NDK开发 CMAKE 相关总结

预设变量含义介绍

工程结构组织:

复制代码
代码目录
├── CMakeLists.txt
├── a
│   ├── CMakeLists.txt
│   └── a.cpp
└── b
    ├── CMakeLists.txt
    ├── b.cpp
    └── b.h

路径相关:

  • CMAKE_SOURCE_DIR:最顶层 CMakceLists.txt 所在的目录
  • CMAKE_CURRENT_SOURCE_DIR:当前 CMakeLists.txt 所在的目录

其他:

CMAKE_PROJECT_NAME:当前项目库名

常见的命令

add_library:

normal library

复制代码
add_library(<name> 
            [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            [source1] [source2 ...])

添加名为 name 的库,库的源文件可指定,也可以用 target_sources() 后续指定

库类型是STATIC(静态库)/SHARED(动态库)/MODULE(模块库)

name 命名必须全局唯一

生成的 library 名会根据 static 或 shared 成为 name.a 或 name.lib

举例:

复制代码
add_library(
        ${CMAKE_PROJECT_NAME}
        SHARED
        xxx.cpp)

imported library

命令格式:

复制代码
add_library(<name> 
            <SHARED|STATIC|MODULE|OBJECT|UNKNOWN>
            IMPORTED
            [GLOBAL])

直接导入已经生成的库,cmake 不会给这类 library 添加编译规则

这种用法的关键在于添加变量 IMPORTED

GLOBAL 可用于设置这个 library 为全局可见

imported 的 library 最重要的属性:

  1. IMPORTED_LOCATION:标明library的位置路径

举例:

复制代码
add_library(
        third_library
        SHARED
        IMPORTED
)

set_target_properties(
        third_library
        PROPERTIES
        IMPORTED_LOCATION
        ${CMAKE_SOURCE_DIR}/libs/libthrid_library.so
)

include_directories:

用于向项目添加头文件搜索路径,当使用该命令时,CMake 会将指定的目录添加到项目中所有目标的包含路径中,以便编译器能够找到这些文件

复制代码
# 添加头文件搜索路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

set_target_properties:

设置目标属性

命令格式:

复制代码
set_target_properties(target1 target2 ...
                      PROPERTIES prop1 value1
                      prop2 value2 ...)

例如:

复制代码
set_target_properties(
    third_party_lib    // 目标:第三方库
    PROPERTIES         // 属性
    IMPORTED_LOCATION  // imported location 的位置属性,即.so文件存放在哪里
    /path/to/third_party_lib.so  // .so 路径
)

当前 set_target_properties 不止能设置 IMPORIED_LOCATION 一个属性能够设置很多,比如 OUTPUT_NAME、CLEAN_DIRECT_OUTPUT、VERSION、SOVERSION等等,可以参考这篇文章看下 cmake命令 set_target_properties

target_include_directories:

  1. 为特定目标设置头文件搜索路径
  2. 作用域限定
  3. 支持 PUBLIC、PRIVATE、INTERFACE选项,其中 PUBLIC 表示这个目标依赖的目标也可以使用这些头文件路径,PRIVATE表示这个目标自己可以使用这些头文件路径,但不会传递给依赖的目标使用,INTERFACE表示只传递给依赖的目标使用

如何在 CMake 项目中导入第三方库的共享库(.so 文件)和 头文件(.h 文件)

  1. 将库文件和头文件复制到项目中:
    1. 将.h文件放到专门的 include 文件夹中,将.so 文件放到 lib 文件夹中
  2. 在CMakeLists.txt中配置库的导入:
    1. 找到项目的CMakeLists.txt文件中
    2. 使用 add_library 命令来创建一个库目标,
    3. 使用set_target_properties 设置第三方库的.so 文件路径位置,
    4. 使用 target_include_directories 命令将包含头文件的目录添加到项目中。
    5. 使用target_link_libraries命令将共享库链接到项目库。

示例代码如下:

复制代码
# 添加共享库
add_library(
   third_party_lib
   SHARED
   IMPORTED
)
set_target_properties(
    third_party_lib 
    PROPERTIES
    IMPORTED_LOCATION 
    /path/to/third_party_lib.so  // .so 路径
)


# 将.h文件路径添加到头文件搜索路径
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)  


# 将库链接到目标
target_link_libraries(
     my_target  // 目标库,当前库
     third_party_lib  // 第三方库
  1. ok,已经可以在项目中使用第三方的功能了,当然仅限头文件中暴露出来的

如何在 CMAKE 项目中集成 opencv SDK

  1. 先从opencv官网下载 opencv android SDK,并解压到指定路径
  2. 在 CMakeLists.text 文件中添加以下内容
复制代码
# 添加OpenCV库
set(OpenCV_DIR /path/to/opencv/sdk/native/jni)
find_package(OpenCV REQUIRED)


# 链接OpenCV库
target_link_libraries(
     YourLibraryName
     ${OpenCV_LIBS}
)
相关推荐
future_li2 分钟前
Speed Tools:一套低侵入的 Android 插件化 + 动态换肤 + 字体切换框架
android
杊页12 分钟前
第一板块:Android 系统基石与运行原理 | 第二篇:Android 编译、打包与安装机制
android·操作系统
故渊at13 分钟前
第十二板块:Android 系统启动与初始化 | 第三十篇:Zygote 孵化机制与 System Server 的启动
android·wms·pms·ams·zygote·ipc
故渊at34 分钟前
第十二板块:Android 系统启动与初始化 | 第二十九篇:Init 进程、RC 脚本与属性服务(Property Service)
android·linux·内存映射·权限控制·init进程·rc脚本·属性服务
故渊at38 分钟前
第十三板块:Android 综合架构与未来演进 | 第三十二篇:Android 内存管理与 LMK 机制的深度剖析
android·架构·内存管理·内存回收·lmk机制·收割算法
故渊at39 分钟前
第十一板块:Android 跨进程通信与 Binder 深度剖析 | 第二十七篇:Binder 线程池与死亡通知(Death Recipient)机制
android·binder·线程池·死亡通知·跨进程通讯
jushi899940 分钟前
FB Neo 街机模拟器全游戏整合版 含25000+街机游戏怀旧复古街机游戏 解压即玩 热门怀旧街机游戏全集安卓+PC电脑版
android·游戏·电脑
vensli41 分钟前
体验专题——Android 应用瘦身实战
android·网络
AFinalStone41 分钟前
Android12 U盘插拔链路源码全解析(七):应用层 —— MediaScanner与SAF
android·frameworks
AI玫瑰助手1 小时前
Python模块:import导入模块与模块的搜索路径
android·开发语言·python