博客
关于我
ndk-cmake
阅读量:790 次
发布时间:2023-02-14

本文共 3471 字,大约阅读时间需要 11 分钟。

CMakeLists.txt 参数详解

CMakeLists.txt 是 CMake(跨平台构建工具)项目的核心配置文件,用于定义项目的构建规则和依赖关系。它通过指定目标文件、依赖文件以及编译选项等,帮助开发者在不同操作系统上一致地编译和打包项目。以下将从多个方面详细解析 CMakeLists.txt 的常用参数和功能。

1. CMakeLists.txt 参数详解

CMakeLists.txt 文件的语法与 HTML 类似,主要通过 <target><include> 等标签来定义项目的构建规则。以下是 CMakeLists.txt 中常见的关键参数和功能:

  • add_library:用于将源代码编译成动态库或静态库。支持多种库类型:

    • STATIC:生成静态库文件(通常扩展名为 .a 或 .lib)。
    • SHARED:生成动态库文件(通常扩展名为 .so 或 .dll)。
    • MODULE:定义模块库,通常用于插件或动态加载的场景。
    • OBJECT:只编译源代码生成目标文件,不打包成库。
  • add_exec:用于将源代码编译成可执行文件。

  • include:包含外部的 CMake 列表文件,用于引用依赖项目。

  • target_link_libraries:将目标文件与库文件或其他动态链接库进行链接。

  • target_include_directories:将目标文件的头文件目录添加到依赖路径中。

  • install:将项目文件安装到指定的目录中。

  • cmake_minimum_required:定义项目所需的最小 CMake 版本。

  • set:用于设置变量,常用于项目配置和依赖管理。

2. CMakeList 初步了解及过程

CMake 是一种跨平台的构建工具,能够自动化项目的编译流程。对于新手来说,掌握 CMake 的基本用法至关重要。以下是 CMake 常用的基本命令和操作步骤:

  • 创建 CMake 列表文件

    cmake_minimum_required(VERSION 3.0)

    这行代码定义了项目所需的最小 CMake 版本,确保后续命令的兼容性。

  • 添加项目依赖

    find_package(Boost REQUIRED)

    通过 find_package 命令,可以查找并添加项目依赖库,如 Boost 库。

  • 定义项目目标

    add_exec(my_project    my_project.cpp    my_project.h    ${Boost_LIBRARIES})

    该命令将指定的源文件和依赖库编译成可执行文件。

  • 编译和安装项目

    • 在终端中执行:
      mkdir buildcd buildcmake ..make
    • 生成构建目录,执行 CMake 并编译项目,然后安装到指定目录。
  • 3. CMake 常用变量

    在 CMake 脚本中,变量是构建配置的重要工具。以下是一些常用的 CMake 变量及其用途:

    • ${CMAKE_CURRENT_SOURCE_DIR}:表示当前源码目录的绝对路径。
    • ${CMAKE_CURRENT_BINARY_DIR}:表示构建目录的绝对路径。
    • ${CMAKE_MODULE_PATH}:包含 CMake 模块的路径,用于查找模块文件。
    • ${Boost_ROOT}:指定 Boost 库的安装路径。

    4. 编译库类型

    在 CMake 中,通过 add_library 命令可以定义不同类型的库文件。以下是几种常见的库类型及其用途:

    静态库(.a、.lib)

    静态库是一种将代码编译进可执行文件或其他库文件中的方式,编译完成后,与项目代码无异。常见于需要高性能或稳定性的场景。

    示例:

    add_library(static_lib    src静态库目录/... )

    动态库(.so、.dll)

    动态库的特点是编译时不将代码编译进可执行文件,而是在运行时动态加载到内存中。适用于需要灵活扩展或共享代码的场景。

    示例:

    add_library(shared_lib    src动态库目录/...)

    模块库(MODULE)

    模块库是一种特殊类型的动态库,通常用于插件或动态加载的场景。与静态库和动态库相比,模块库具有更高的灵活性。

    示例:

    add_library(module_lib    src模块库目录/...)

    对象库(OBJECT)

    对象库是将源文件编译成目标文件的中间步骤,不将其打包成最终的库文件。

    示例:

    add_library(object_lib    src对象库目录/...)

    5. 其他参考文章

    如果需要更深入的学习,以下是一些推荐的参考文章和资源:

    • 《CMake 实战指南》 - 书中详细介绍了 CMake 的使用方法和实战技巧。
    • CMake 官方文档 - 提供了最新的 CMake 功能说明和详细语法参考。
    • CMake 用户论坛 - 提供了丰富的学习资源和技术支持。

    6. 编译库类型

    在 CMake 脚本中,通过 add_library 命令可以定义不同类型的库文件。以下是几种常见的库类型及其用途:

    静态库(.a、.lib)

    静态库是一种将代码编译进可执行文件或其他库文件中的方式,编译完成后,与项目代码无异。常见于需要高性能或稳定性的场景。

    示例:

    add_library(static_lib    src静态库目录/... )

    动态库(.so、.dll)

    动态库的特点是编译时不将代码编译进可执行文件,而是在运行时动态加载到内存中。适用于需要灵活扩展或共享代码的场景。

    示例:

    add_library(shared_lib    src动态库目录/...)

    模块库(MODULE)

    模块库是一种特殊类型的动态库,通常用于插件或动态加载的场景。与静态库和动态库相比,模块库具有更高的灵活性。

    示例:

    add_library(module_lib    src模块库目录/...)

    对象库(OBJECT)

    对象库是将源文件编译成目标文件的中间步骤,不将其打包成最终的库文件。

    示例:

    add_library(object_lib    src对象库目录/...)

    8. 若出现 "undefined reference to XXX" 错误

    在开发过程中,可能会遇到类似 "undefined reference to XXX" 的错误提示。以下是可能的原因及解决方法:

  • 未引入对应的头文件或源文件:错误提示通常会指向缺失的引用文件。可以通过检查项目中是否缺少对应的 .h 或 .cc 文件,或者检查 CMakeLists.txt 中是否正确地包含了这些文件。

  • C++ 与 C 编译冲突:在 C++ 中使用 .cc 文件时,可能需要在对应的 .h 文件中添加 extern "C" 声明,避免编译时的符号冲突。

    示例:

    extern "C" {    #include 
    }
  • 动态链接库路径问题:在 Android 开发中,如果通过 CMake 链接外部动态链接库,可能会出现 dlopen 失败的错误。这种情况下,需要确保动态链接库被正确打包并放置在 jniLibs 目录中。

  • 9. 出现 "android NativeLibrary: java.lang.UnsatisfiedLinkError: dlopen failed: library "libavutil.so" not found" 错误

    在 Android 开发中,当通过 CMake 打包动态链接库时,可能会遇到类似以下错误:

    android NativeLibrary: java.lang.UnsatisfiedLinkError: dlopen failed: library "libavutil.so" not found

    这种错误通常是因为动态链接库未被正确打包并包含在 APK 文件中。以下是解决方法:

  • 检查 CMakeLists.txt 中的依赖管理:确保通过 target_link_libraries 命令正确地链接了所有需要的动态链接库。

  • 按照 Android gradle 编译脚本要求打包:将动态链接库按照 gradle 脚本中的 jniLibs 目录结构进行组织和编译。

  • 测试和调试:在 Android 模拟器中运行项目,确保动态链接库能够被正确加载和调用。

  • 通过以上方法,可以有效解决动态链接库加载失败的问题,确保项目能够顺利运行。

    转载地址:http://eycfk.baihongyu.com/

    你可能感兴趣的文章
    mysql社工库搭建教程_社工库的搭建思路与代码实现
    查看>>
    mysql笔记 (早前的,很乱)
    查看>>
    MySQL笔记:InnoDB的锁机制
    查看>>
    mysql第一天~mysql基础【主要是DDL、DML、DQL语句,以及重点掌握存存引擎、查询(模糊查询)】
    查看>>
    mysql第二天~mysql基础【查询排序、分页查询、多表查询、数据备份与恢复等】
    查看>>
    MySQL简单查询
    查看>>
    MySQL管理利器 MySQL Utilities 安装
    查看>>
    mysql类型转换函数convert与cast的用法
    查看>>
    mysql系列一
    查看>>
    MySQL系列之数据类型(Date&Time)
    查看>>
    MySQL系列之数据类型(Date&Time)
    查看>>
    Mysql系列之锁机制
    查看>>
    Mysql系列九:使用zookeeper管理远程Mycat配置文件、Mycat监控、Mycat数据迁移(扩容)...
    查看>>
    Mysql索引
    查看>>
    mysql索引
    查看>>
    mysql索引
    查看>>
    Mysql索引,索引的优化,如何避免索引失效案例
    查看>>
    Mysql索引、命令重点介绍
    查看>>
    mysql索引、索引优化(这一篇包括所有)
    查看>>
    MySQL索引一篇带你彻底搞懂(一次讲清实现原理加优化实战,面试必问)
    查看>>