预设变量含义介绍
工程结构组织:
代码目录 ├── 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 最重要的属性:
- 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 // 第三方库
- 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} )