1.cmake
CMake是一个跨平台的安装(编译)工具,它允许开发者使用简单的语句来描述所有平台的安装(编译)过程。以下是关于CMake的详细介绍:
一、基本概述
- 定义:CMake是一个开源、跨平台的自动化构建系统,它使用CMakeLists.txt脚本文件来定义构建过程。
- 功能:CMake能够生成标准的构建文件(如Makefile、Visual Studio项目文件等),支持多种构建工具和集成开发环境(IDE),如Make、Ninja、Visual Studio、Xcode等。
- 特点:CMake具有跨平台性、模块化和可扩展性,能够自动检测系统和库的可用性,简化项目配置过程。
二、主要特点
- 跨平台性:CMake支持在多个操作系统上运行,包括Linux、Windows、macOS等,使得跨平台开发更加容易。
- 生成器:CMake不直接构建出最终的软件,而是生成标准的构建文件(如Makefile、Visual Studio项目文件等),然后再使用相应的构建工具进行编译。
- 自动检测和配置:CMake能够自动检测系统和库的可用性,简化项目配置过程,帮助开发者找到所需的依赖项。
- 模块化和可扩展:CMake的配置是基于模块的,开发者可以编写自定义的CMake模块以满足特定需求。这使得CMake非常灵活和可扩展。
- 简洁的CMakeLists.txt文件:项目的配置信息通常存储在CMakeLists.txt文件中,这是一种清晰、易于维护的方式来描述项目的结构和构建规则。
三、使用场景
CMake广泛用于各种大型项目的构建过程中,特别是当项目需要跨平台构建时。例如,许多开源项目如VTK、ITK、PCL等都使用CMake作为构建系统。
四、基本用法
- 编写CMakeLists.txt文件:定义项目名称、源文件、库依赖等信息。
- 生成构建文件:在命令行中执行
cmake
命令,指定CMakeLists.txt文件所在路径和构建目录(可选)。CMake将根据CMakeLists.txt文件生成相应的构建文件。 - 构建项目:使用生成的构建文件(如Makefile、Visual Studio项目文件等)来构建项目。这通常涉及执行
make
(或相应的构建命令)来编译源代码并生成可执行文件或库。
五、安装与升级
CMake的安装和升级可以通过多种方式完成,包括使用包管理器(如apt-get、yum等)、下载源码包编译安装等。具体方法取决于操作系统和用户的需求。
六、总结
CMake是一个功能强大的跨平台构建系统,它使用简单的语句来描述所有平台的安装(编译)过程。通过生成标准的构建文件和使用自动检测与配置功能,CMake简化了跨平台开发的过程,并提高了开发效率。随着开源项目的不断发展壮大,CMake在软件构建领域的应用也越来越广泛。
2.cmake常用命令
CMake是一个跨平台的自动化构建系统,它使用CMakeLists.txt
文件来描述项目的构建过程。在CMake中,存在多种常用命令,这些命令用于定义项目结构、配置编译选项、添加库依赖等。以下是一些CMake的常用命令及其基本用法:
1. cmake_minimum_required
- 功能:指定CMake的最低版本要求。
- 语法:
cmake_minimum_required(VERSION major.minor [patch [tweak]])
- 示例:
cmake_minimum_required(VERSION 3.10)
2. project
- 功能:设置项目工程名字,并可指定工程的版本、工程描述、web主页地址、支持的语言等。
- 语法:
project(<project_name> [VERSION <version>] [DESCRIPTION <description>] [HOMEPAGE_URL <url>] [LANGUAGES <language>...])
- 示例:
project(MyProject VERSION 1.0 LANGUAGES CXX)
3. add_executable
- 功能:用于创建一个可执行文件的目标,将源代码文件编译为可执行文件。
- 语法:
add_executable(<name> [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
- 示例:
add_executable(myapp main.cpp)
4. add_library
- 功能:用于将源代码文件编译为库文件。
- 语法:
add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 [source2 ...])
- 示例:
add_library(mylibrary STATIC mylibrary.cpp)
5. target_include_directories
- 功能:为指定的目标(可执行文件或库)添加包含目录,以便编译器在编译时能够找到相应的头文件。
- 语法:
target_include_directories(<target> [SYSTEM|BEFORE] [INTERFACE|PUBLIC|PRIVATE] [items1...]...)
- 示例:
target_include_directories(mylibrary PUBLIC include)
6. link_directories
- 功能:指定链接器搜索库文件的目录。
- 语法:
link_directories(directory1 directory2 ...)
- 注意:在现代CMake中,更推荐使用
target_link_libraries
命令结合IMPORTED
目标来链接库,因为这种方法更加灵活和清晰。
7. target_link_libraries
- 功能:为指定的目标(可执行文件或库)链接库文件。
- 语法:
target_link_libraries(<target> <PRIVATE|PUBLIC|INTERFACE> <item>... [...])
- 示例:
target_link_libraries(myapp PRIVATE mylibrary)
8. set
- 功能:设置变量的值。CMake中的变量可以包含字符串、路径、列表等数据类型。
- 语法:
set(<variable> <value> [CACHE <type> <docstring> [FORCE]])
- 示例:
set(CMAKE_CXX_STANDARD 11)
9. include_directories
- 功能:添加包含目录给编译器,以便编译器在编译源文件时能够找到相应的头文件。
- 语法:
include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
- 注意:在现代CMake中,更推荐使用
target_include_directories
命令,因为它允许更细粒度的控制。
10. message
- 功能:向终端输出信息。
- 语法:
message([STATUS|WARNING|AUTHOR_WARNING|FATAL_ERROR|SEND_ERROR] "message to display" ...)
- 示例:
message(STATUS "This is a status message.")
11. file
- 功能:提供文件操作功能,如读写文件、文件系统操作、路径转换等。
- 语法:
file(子命令 <参数> ...)
- 示例:
file(GLOB MAIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
12. aux_source_directory
- 功能:查找指定目录下的所有源文件,并将它们存储到一个变量中。
- 语法:
aux_source_directory(<dir> <variable>)
- 示例:
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/src SRC_LIST)
13. add_subdirectory
- 功能:向项目中添加子目录,以便在该子目录中构建其他CMake项目。
- 语法:
add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
- 示例:
add_subdirectory(subdirectory)
总结
以上列出的命令是CMake中最为常用的一些命令,它们涵盖了项目配置、文件操作、目标添加和链接等多个方面。通过合理使用这些命令,可以高效地构建出复杂的跨平台项目。需要注意的是,随着CMake版本的更新,一些命令的用法可能会发生变化,因此建议查阅最新的CMake文档以获取最准确的信息。