CMAKE学习记录
介绍
CMake 是一个跨平台的开源构建工具,用于管理软件构建过程。它采用了一种声明式的构建配置语言,可以生成与平台无关的构建脚本,使得在不同的操作系统和编译器上都能够方便地构建项目。
CMake 的设计目标是提供一个简洁、高效的构建系统,以更好地支持大型项目的构建和管理。它具有以下特点:
-
简单易用:CMake 提供了简洁的声明式配置语言,可以方便地描述项目的组织结构、依赖关系和构建规则。
-
跨平台支持:CMake 可以生成各种操作系统和编译器平台所需的构建脚本,包括 Unix、Linux、Windows、Mac 等。
-
自动化构建:CMake 可以自动检测项目的依赖关系,自动生成构建规则,并支持增量构建、多线程构建等功能,提高构建效率。
-
模块化和可扩展:CMake 支持通过模块(Module)扩展功能,可以灵活地定制构建流程和配置选项。
-
多种构建系统支持:CMake 可以生成各种主流的构建系统的配置文件,如 Makefile、Ninja、Visual Studio、Xcode 等。
-
广泛应用:CMake 在众多开源项目和商业项目中得到了广泛的应下:
-
创建一个 CMakeLists.txt 文件,使用 CMake 提供的式语法描述项目的组织结构、依赖关系和构建规则。
-
运行 CMake 命令,CMake 会解析 CMakeLists.txt 文件,并根据配置生成对应的构建系统配置文件(如 Makefile、Visual Studio 工程文件等)。
-
使用生成的构建系统配置文件进行构建,即可生成可执行文件、库文件或其他构建产物。
常用函数
INCLUDE_DIRECTORIES
include_directories ([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])
# 加入所有头文件
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
target_link_libraries
target_link_libraries(<target> [item1] [item2] [...]
[[debug|optimized|general] <item>] ...)
就是将之前打包的库,链接到生成的目标上,不然会出现光声明,没定义的错误,注意也可以直接指定库名。如:
target_link_libraries(main XXX.so) # or target_link_libraries(main XXX.a)
上述指令中的<target>是指通过add_executable()和add_library()指令生成已经创建的目标文件。而[item]表示库文件没有后缀的名字。默认情况下,库依赖项是传递的。当这个目标链接到另一个目标时,链接到这个目标的库也会出现在另一个目标的连接线上。
target_link_options
target_link_options(<target> [BEFORE] <INTERFACE|PUBLIC|PRIVATE> [items1...] [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
将额外的链接选项添加到可执行文件,共享库或模块库目标,此命令不能用于为静态库目标添加选项。例如:
target_link_options(${TARGET} PRIVATE -Wl,--print-memory-usage)
target_link_libraries
target_link_libraries(<target>
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])
执行链接操作,可以链接生成库,也可以链接生成可执行文件,通过 add_library 或 add_executable 之后,必须调用 target_link_libraries 来完成链接,其中:
- PRIVATE:仅仅编译到target中,不对外提供接口
- PUBLIC:编译到target中,同时对外提供接口
- INTERFACE:不编译到target中,仅仅对外提供其接口