Android NDK开发 CMAKE 相关总结

server/2024/9/23 5:59:44/

预设变量含义介绍

工程结构组织:

代码目录
├── 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}SHAREDxxx.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_librarySHAREDIMPORTED
)set_target_properties(third_libraryPROPERTIESIMPORTED_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 value1prop2 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_libSHAREDIMPORTED
)
set_target_properties(third_party_lib PROPERTIESIMPORTED_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}
)


http://www.ppmy.cn/server/19258.html

相关文章

AutoGPT-Forge使用教程,自行构建agent智能体

本博客给出AutoGPT-forge四个教程的翻译与理解&#xff0c;使用GPT4翻译&#xff0c; 参考官方教程https://aiedge.medium.com/autogpt-forge-a-comprehensive-guide-to-your-first-steps-a1dfdf46e3b4 使用AutoGPT Github代码日期2024/4/22&#xff1b; 博客开始编辑日期20…

【后端学习笔记·Golang】手机短信验证

文章目录 手机号码验证前置准备开通阿里云sms服务获取AccessKey并下载sdk 生成随机验证码将验证码发送到用户手机接口发送验证码校验验证码 手机号码验证 流程&#xff1a; 接收用户请求后生成随机验证码&#xff0c;并将验证码存入Redis中&#xff0c;并设置TTL通过阿里云sd…

easyExcel快速入门

目录 &#x1f9c2;1.简单介绍 &#x1f32d;2.快速入门 &#x1f953;1.导入依赖 &#x1f37f;2.导出到excel &#x1f38f;3.读入数据 &#x1f389;4.下载 1.简单介绍 传统操作Excel大多都是利用Apach POl进行操作的,但是POI框架并不完善,使用过程非常繁琐且有较多…

计算机网络【CN】Ch4 网络层

总结 一台主机可以有多个IP地址&#xff0c;但是必须属于多个逻辑网络【不同的网络号】。 解决IP地址耗尽&#xff1a; IP地址结构&#xff1a; 划分子网&#xff1a;&#x1d43c;&#x1d443;地址<网络号>,<子网号>,<主机号> CIDR&#xff1a;IP地址{&…

前后缀分离,CF1209 C. Maximal Intersection

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 Problem - 1029C - Codeforces 二、解题报告 1、思路分析 线段相交具有可…

Ali-Sentinel-入口控制

​ 归档 GitHub: Ali-Sentinel-入口控制 测试 // 在 demo-spring-webmvc 里新建测试类public class TestMain {public static void main(String[] args) throws InterruptedException {initFlowRules(); // 初始化规则while (true) {// 1.5.0 版本开始可以直接利用 try-with…

(css)鼠标移出样式不变

(css)鼠标移出样式不变 需求&#xff1a;列表鼠标移入切换样式&#xff0c;移出保持不变 <divv-for"(item, index) of newsList":key"index"class"news-list":class"{active : change index}"tabindex"1"mouseenter&quo…

无法枚举容器内对象 访问被拒绝

转载开源 【无法枚举容器内对象 访问被拒绝_无法枚举容器中的对象,访问被拒绝-CSDN博客】