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 最重要的属性:
- 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:
- 为特定目标设置头文件搜索路径
- 作用域限定
- 支持 PUBLIC、PRIVATE、INTERFACE选项,其中 PUBLIC 表示这个目标依赖的目标也可以使用这些头文件路径,PRIVATE表示这个目标自己可以使用这些头文件路径,但不会传递给依赖的目标使用,INTERFACE表示只传递给依赖的目标使用
如何在 CMake 项目中导入第三方库的共享库(.so 文件)和 头文件(.h 文件)
- 将库文件和头文件复制到项目中:
- 将.h文件放到专门的 include 文件夹中,将.so 文件放到 lib 文件夹中
- 在CMakeLists.txt中配置库的导入:
- 找到项目的CMakeLists.txt文件中
- 使用 add_library 命令来创建一个库目标,
- 使用set_target_properties 设置第三方库的.so 文件路径位置,
- 使用 target_include_directories 命令将包含头文件的目录添加到项目中。
- 使用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
- 先从opencv官网下载 opencv android SDK,并解压到指定路径
- 在 CMakeLists.text 文件中添加以下内容
# 添加OpenCV库 set(OpenCV_DIR /path/to/opencv/sdk/native/jni) find_package(OpenCV REQUIRED) # 链接OpenCV库 target_link_libraries( YourLibraryName ${OpenCV_LIBS} )
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!
