Android NDK开发 CMAKE 相关总结

2024-05-13 1343阅读

预设变量含义介绍

工程结构组织:

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( 
                [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( 
                
                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  // 第三方库
    

         3. 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}
    )
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]