找回密码
 立即注册
搜索
热搜: 星闪 最新 活动
查看: 230|回复: 0

CMake简介与使用指南

[复制链接]

17

主题

0

回帖

101

积分

注册会员

积分
101
发表于 2024-11-29 16:19:04 | 显示全部楼层 |阅读模式
1. CMake简介

CMake是一种跨平台的构建系统生成工具,它能够根据用户编写的配置文件(CMakeLists.txt),生成适用于不同平台和编译器的构建文件(如Makefile、Visual Studio工程等)。CMake不仅支持简单的项目配置,还能处理复杂的依赖关系和构建流程。

CMake的主要特点包括:

-  跨平台支持 :能够生成适用于Windows、macOS、Linux等不同操作系统的构建文件。
-  灵活性 :支持自定义构建规则,能够处理复杂的项目结构。
-  模块化 :通过CMake模块可以扩展其功能,支持更多工具和库。
-  外部项目支持 :可以轻松地集成第三方库和项目。

2. CMake的基本概念和命令

   2.1 CMakeLists.txt

CMake使用的配置文件名为`CMakeLists.txt`。这是CMake项目的核心文件,用于定义项目的名称、版本、源文件、依赖库等信息。每个项目至少需要一个`CMakeLists.txt`文件,放在项目的根目录中。
CMakeLists.txt的结构
一个典型的CMakeLists.txt文件包括以下部分:
项目声明:定义项目名称、版本号、支持的语言等信息。
依赖管理:查找和引入外部库或模块。
目标定义:定义可执行文件、库等构建目标及其属性。
构建规则:指定如何编译源文件、链接库文件,以及如何设置编译选项。

   2.2 常用命令

以下是一些CMake中常用的命令:

-  `cmake_minimum_required(VERSION x.x)` :指定CMake的最低版本要求。如果用户的CMake版本低于此要求,将会抛出错误。

-  `project(name [LANGUAGES])` :定义项目的名称和使用的编程语言,如C、C++等。`name`为项目名称,`LANGUAGES`可以指定项目使用的语言,例如`C CXX`。

-  `add_executable(name src1 src2 ...)` :定义一个可执行文件的生成规则,其中`name`为生成的可执行文件名称,`src1`、`src2`等为源文件列表。

-  `add_library(name [STATIC | SHARED | MODULE] src1 src2 ...)` :定义一个库的生成规则,`STATIC`表示静态库,`SHARED`表示动态库,`MODULE`表示插件库。

-  `target_link_libraries(target_name library1 library2 ...)` :指定目标文件需要链接的库,`target_name`为目标文件名称(可执行文件或库),`library1`、`library2`等为需要链接的库名称。

-  `include_directories(dir1 dir2 ...)` :指定头文件搜索路径,`dir1`、`dir2`等为目录列表。

-  `find_package(package [version] REQUIRED)` :查找并加载外部库,`package`为库名称,`version`为版本号,`REQUIRED`表示该库是必须的,如果找不到将会报错。

-  `set(variable value)` :设置变量的值,`variable`为变量名称,`value`为变量值。

-  `option(variable "description" [value])` :定义一个布尔选项,`variable`为选项名称,`description`为描述,`value`为默认值(ON或OFF)。

   2.3 构建过程

CMake的构建过程通常包括以下几个步骤:

1.  配置(Configure) :运行CMake命令,将`CMakeLists.txt`文件解析生成构建系统的文件,如Makefile或Visual Studio工程文件。
   
   ```bash
   cmake -S . -B build
   ```

   其中,`-S`表示源目录,`-B`表示构建目录。通常将构建文件放在独立的目录中以保持源代码目录的清洁。

2.  构建(Build) :运行生成的构建系统文件,如使用Makefile时运行`make`命令。

   ```bash
   cmake --build build
   ```

3.  安装(Install) (可选):将生成的可执行文件、库、头文件等安装到指定位置。

   ```bash
   cmake --install build
   ```

4.  测试(Test) (可选):运行项目的测试用例,确保构建结果的正确性。

   ```bash
   ctest --test-dir build
   ```
3. CMake高级用法

3.1 自定义命令和目标

CMake允许用户定义自定义命令和目标以实现更复杂的构建需求。

-  `add_custom_command(OUTPUT output ... COMMAND command ... [ARGS] ...)` :定义自定义命令,用于生成指定的输出文件。

-  `add_custom_target(target_name [ALL] [command ...])` :定义自定义目标,`target_name`为目标名称,`ALL`表示该目标在执行`make`时自动构建。

  3.2 使用外部项目

CMake支持通过`ExternalProject`模块来管理和构建外部项目。

```cmake
include(ExternalProject)
ExternalProject_Add(project_name
    GIT_REPOSITORY <repository_url>
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=<install_dir>
)
```

3.3 导出和安装

-  `install(TARGETS target_name ...)` :定义目标文件的安装规则。

-  `install(FILES file1 file2 ... DESTINATION dir)` :定义文件的安装规则,将文件安装到指定目录。

-  `export(EXPORT package_name ...)` :导出项目的构建结果,以供其他CMake项目使用。

4. 实践案例

   4.1 简单项目

```cmake
cmake_minimum_required(VERSION 3.10)
project(SimpleProject)

add_executable(hello main.cpp)
```

   4.2 使用外部库

```cmake
cmake_minimum_required(VERSION 3.10)
project(UsingLib)

find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

add_executable(hello main.cpp)
target_link_libraries(hello ${OpenCV_LIBS})
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|【淇诺科技】技术论坛 ( 粤ICP备14010465号-1|粤ICP备14010465号-1 )

GMT+8, 2026-4-2 15:59 , Processed in 0.136784 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表