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}
)
相关推荐
长亭外的少年2 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
如若1233 小时前
主要用于图像的颜色提取、替换以及区域修改
人工智能·opencv·计算机视觉
建群新人小猿4 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神5 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
兰琛5 小时前
20241121 android中树结构列表(使用recyclerView实现)
android·gitee
lsjweiyi6 小时前
极简AI工具箱网站开源啦!
opencv·开源·微信支付·支付宝支付·百度ai·极简ai工具箱·ai图像处理
Y多了个想法6 小时前
RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526
android·rk3568·触摸屏·tp·敦泰·focaltech·ft5526
NotesChapter7 小时前
Android吸顶效果,并有着ViewPager左右切换
android
_祝你今天愉快8 小时前
分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.
android
暮志未晚Webgl9 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5