Cmake

2023-12-22 23:34:17

一、CMake 和 Makefile、Make关系

CMake是一个开源的、跨平台的自动化构建工具,通过cmake我们可以轻松地管理我们的项目。注意:·CMake并不是包管理工具!·CMake并不只支持C/C++。掌握CMake是学习C++必经之路!

CMake 和 Makefile 是两个不同的概念,它们之间有一定的关系。

  1. Makefile:

    • Makefile 是一种用于构建和编译项目的脚本文件。它定义了项目中的源文件、依赖关系以及构建规则。通过执行 make 命令,Makefile 可以根据规则和依赖关系自动构建项目。
    • Makefile 主要用于管理项目的构建流程,包括编译、链接等过程。Makefile 是一种特定于 Unix/Linux 系统的构建工具,通常使用 GNU Make 来执行。
  2. CMake:

    • CMake 是一个跨平台的构建系统生成工具。它不直接执行构建操作,而是生成适用于各种构建系统的配置文件,比如 Makefile、Visual Studio 的项目文件等。
    • CMake 的主要优势在于提供了一个统一的、与编译器无关的配置文件,使得项目能够在不同的操作系统和编译器中进行构建。通过执行 cmake 命令生成构建文件,然后使用生成的构建文件进行实际的编译和构建。
  3. 关系:

    • CMake 可以生成 Makefile,这样就能够利用 Make 来执行项目的构建。但 CMake 并不仅限于生成 Makefile,它还可以生成其他构建系统的配置文件,如 Visual Studio 的项目文件、Ninja 等。
    • CMake 的目标是提供一种跨平台、与编译器无关的构建解决方案,使得开发者能够更轻松地在不同平台上构建和管理项目。

????????在一个典型的 CMake 项目中,开发者会编写 CMakeLists.txt 文件,描述项目的结构、依赖关系和构建规则。然后,执行 cmake 命令生成适用于目标平台的构建文件(如 Makefile),最后使用 make 命令或其他适当的构建系统来进行实际的编译和构建。这种方式使得项目可以更容易地在不同的平台和编译器上进行构建。

1.编写CMakeLists.txt文件

CMakeLists.txt 是一个用于配置和生成项目的 CMake 构建系统的配置文件。CMake 是一个跨平台的构建工具,可以用于管理 C++ 项目的构建过程。CMakeLists.txt 文件通常位于项目的根目录,并包含了一系列指令和配置,用于描述项目的结构和构建过程。

下面是最基本的配置 cmake_minimum_required(VERSION3.20)#最小版本 project(Hello)#项目名。 add_executable(Hello hello.cpp)#抽源文件生成一个可执行的程序

# 设置最低的 CMake 版本要求
cmake_minimum_required(VERSION 3.10)

# 设置项目名称
project(MyProject)

# 添加可执行文件,并指定源文件
add_executable(my_executable main.cpp)

# 添加头文件搜索路径
include_directories(include)

# 添加链接库
target_link_libraries(my_executable my_library)
2.cmake -B build

创建一个build并在此目录下生成makefile或其他文件

3.cmake --build build生成项目

二、通过源码安装Cmake

大家也可以通过直接下载的方式

# 安装 build-essential 和 wget
sudo apt-get update
sudo apt-get install build-essential wget

# 下载 CMake 源代码
wget https://cmake.org/files/v3.28/cmake-3.28.0.tar.gz

# 解压下载的压缩包
tar -zxvf cmake-3.28.0.tar.gz

# 进入 cmake 目录
cd cmake-3.28.0

# 配置构建
./configure

# 编译 CMake
sudo make

# 安装 CMake
sudo make install

# 检查 CMake 版本
cmake --version

三、Cmake用法

1. 首先创建CMakeLists.txt文件“
cmake minimum_required(VERSION 3.20) 
project(hello) 
add executable(hello hello.cpp)

2.? 生成构建系统文件Makefile
cmake -B build

3. 生成二进制可执行文件

Cmake --Build Build

?四、Cmake语法

1. 运行.cmake文件

在CMake中,.cmake文件通常用于存储CMake脚本片段,它们包含了一些CMake的配置、设置或功能定义。这样的脚本片段可以被其他CMakeLists.txt文件或者CMake脚本引入(include)。

有几种用途和场景,其中之一是模块化地组织CMake配置。这对于将项目配置分割成小块、提高可维护性、重用相似配置或功能块非常有用。在项目中,你可能会看到一些通用的配置放在一个单独的 .cmake 文件中,然后通过 include() 命令在CMakeLists.txt中引入。

示例 .cmake 文件:

# common_config.cmake

# 设置编译器标志
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

# 定义一个函数
function(print_hello)
    message("Hello from common_config.cmake")
endfunction()

在项目的CMakeLists.txt中引入这个 .cmake 文件:

# CMakeLists.txt

# 引入 common_config.cmake 文件
include(common_config.cmake)

# 添加可执行文件
add_executable(my_executable main.cpp)

# 调用函数
print_hello()

????????这样做有助于保持CMakeLists.txt的整洁,将配置细节分离出去,提高了代码的可读性和可维护性。.cmake 文件可以用于定义变量、函数、宏等,然后在其他CMake脚本中进行引用和使用。

cmake -P *.cmake

?比如有一个first.cmake文件,其中是message("hello") 。?cmake -P first.cmake

?获取Cmake中信息,

${}

2. Set语法

3. List语法

?4. 流程控制

5.? 函数

6. 作用域和宏

五、Cmake构建项目方式

1.?直接写入源码路径的方式

2.?调用子目录cmake脚本的方法

在cmkae文件中 ,将cpp文件赋给变量,然后在cmakeLists.txt文件中使用include方法引入cmake文件,然后将变量添加道add_executable中

3. CmakeList嵌套

# 指定 CMake 最低版本要求
cmake_minimum_required(VERSION 3.20.0)

# 定义项目并指定编程语言为 C++
project(Animal CXX)

# 添加子目录,包含 'animal' 库的 CMakeLists.txt
add_subdirectory(animal)

# 添加可执行文件,并链接 'AnimalLib' 库
add_executable(Animal main.cpp)

# 将 'AnimalLib' 库链接到 'Animal' 可执行文件
target_link_libraries(Animal PUBLIC AnimalLib)

# 包含 'animal' 头文件目录
target_include_directories(Animal PUBLIC "${PROJECT_SOURCE_DIR}/animal")

?

4.Object Libraries

?六、Cmake如何生成静态库和动态库

七、Cmake如何使用动态库和静态库

1. 静态库

2. 动态库

八、 Cmake与源文件交互

九、条件编译

https://blog.csdn.net/weixin_43717839/article/details/128032486?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170315785016777224419267%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170315785016777224419267&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-128032486-null-null.142^v96^pc_search_result_base9&utm_term=cmake&spm=1018.2226.3001.4187

文章来源:https://blog.csdn.net/leimeili/article/details/135140073
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。