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}
)
相关推荐
似霰33 分钟前
安卓adb shell串口基础指令
android·adb
起个破名想半天了1 小时前
计算机视觉cv入门之答题卡自动批阅
人工智能·opencv·计算机视觉
鸿蒙布道师1 小时前
OpenAI为何觊觎Chrome?AI时代浏览器争夺战背后的深层逻辑
前端·人工智能·chrome·深度学习·opencv·自然语言处理·chatgpt
神奇侠20242 小时前
基于opencv和PaddleOCR识别身份证信息
opencv·paddleocr
fatiaozhang95273 小时前
中兴云电脑W102D_晶晨S905X2_2+16G_mt7661无线_安卓9.0_线刷固件包
android·adb·电视盒子·魔百盒刷机·魔百盒固件
CYRUS_STUDIO4 小时前
Android APP 热修复原理
android·app·hotfix
鸿蒙布道师4 小时前
鸿蒙NEXT开发通知工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
鸿蒙布道师4 小时前
鸿蒙NEXT开发网络相关工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
满怀10154 小时前
【OpenCV图像处理实战】从基础操作到工业级应用
图像处理·人工智能·python·opencv·计算机视觉·编程入门
大耳猫4 小时前
【解决】Android Gradle Sync 报错 Could not read workspace metadata
android·gradle·android studio