C++ CMake FetchContent用法介绍

CMake 的 FetchContent 模块是一个非常方便的工具,用于在构建过程中从远程位置下载和管理外部依赖项。通过 FetchContent,您可以在项目的 CMake 配置过程中下载、提取和添加外部项目,而不需要手动管理这些依赖项。下面是 FetchContent 的基本用法介绍以及一个简单的代码示例,代码结构如下:
在这里插入图片描述

FetchContent 基本用法

  1. 引入 FetchContent 模块
    在 CMakeLists.txt 文件中,首先需要引入 FetchContent 模块:

    include(FetchContent)
    
  2. 声明并下载外部项目
    使用 FetchContent_Declare 函数声明外部项目,并使用 FetchContent_MakeAvailable 函数下载并解压该项目。例如,下载并构建一个外部项目 googletest

    FetchContent_Declare(
      googletest
      GIT_REPOSITORY https://github.com/google/googletest.git
      GIT_TAG release-1.11.0
    )
    
    FetchContent_MakeAvailable(googletest)
    
  3. 使用外部项目
    一旦外部项目被下载和解压,就可以像项目中的其他库一样使用它。例如,链接 googletest 库到你的项目中:

    target_link_libraries(my_project PRIVATE gtest_main)
    

完整示例

下面是一个完整的示例,演示如何使用 FetchContent 下载并构建 googletest 并将其链接到一个简单的 C++ 项目。

项目结构:

/my_project
|-- CMakeLists.txt
|-- src
|   |-- main.cpp
|-- tests
    |-- test_main.cpp

CMakeLists.txt:

cmake_minimum_required(VERSION 3.14)
project(MyProject)

# 设置C++标准
set(CMAKE_CXX_STANDARD 14)

# 引入FetchContent模块
include(FetchContent)

# 声明googletest
FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG release-1.11.0
)

# 下载并解压googletest
FetchContent_MakeAvailable(googletest)

# 添加源文件
add_executable(my_project src/main.cpp)

# 链接googletest库到测试项目
enable_testing()
add_executable(test_main tests/test_main.cpp)
target_link_libraries(test_main PRIVATE gtest_main)

# 添加测试
add_test(NAME MyTest COMMAND test_main)

src/main.cpp:

#include <iostream>

int main() {
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

tests/test_main.cpp:

#include <gtest/gtest.h>

TEST(SampleTest, AssertionTrue) {
    EXPECT_TRUE(true);
}

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

解释

  1. CMakeLists.txt 中包含了项目配置、FetchContent 配置以及项目和测试可执行文件的构建和链接。
  2. FetchContent_DeclareFetchContent_MakeAvailable 用于声明和下载 googletest
  3. 使用 target_link_librariesgoogletest 链接到测试可执行文件 test_main
  4. tests/test_main.cpp 中编写了一个简单的测试案例,并使用 gtest_main 运行所有测试。

通过这种方式,您可以轻松地在项目中引入和管理外部依赖项,而无需手动下载和配置这些库。
注意由于需要从github下载库,得有合适的网络环境,不然会无法下载或编译失败,例如下图:
在这里插入图片描述
如果是正常编译下载库,在编译后的目录build/_deps是FetchContent下载的库

FetchContent如何添加多个库

使用 CMake 的 FetchContent_DeclareFetchContent_MakeAvailable 可以下载和管理多个库。您只需为每个库单独调用 FetchContent_DeclareFetchContent_MakeAvailable

示例代码

假设您想要下载并使用 googletestfmt 库,这里是如何编写 CMakeLists.txt 文件的示例。

项目结构:

/my_project
|-- CMakeLists.txt
|-- src
|   |-- main.cpp
|-- tests
    |-- test_main.cpp

CMakeLists.txt:

cmake_minimum_required(VERSION 3.14)
project(MyProject)

# 设置C++标准
set(CMAKE_CXX_STANDARD 14)

# 引入FetchContent模块
include(FetchContent)

# 声明googletest
FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG release-1.11.0
)

# 声明fmt
FetchContent_Declare(
  fmt
  GIT_REPOSITORY https://github.com/fmtlib/fmt.git
  GIT_TAG 8.0.1
)

# 下载并解压所有声明的内容
FetchContent_MakeAvailable(googletest fmt)

# 添加源文件
add_executable(my_project src/main.cpp)

# 链接fmt库到主项目
target_link_libraries(my_project PRIVATE fmt::fmt)

# 链接googletest库到测试项目
enable_testing()
add_executable(test_main tests/test_main.cpp)
target_link_libraries(test_main PRIVATE gtest_main)

# 添加测试
add_test(NAME MyTest COMMAND test_main)

src/main.cpp:

#include <iostream>
#include <fmt/core.h>

int main() {
    fmt::print("Hello, World!\n");
    return 0;
}

tests/test_main.cpp:

#include <gtest/gtest.h>

TEST(SampleTest, AssertionTrue) {
    EXPECT_TRUE(true);
}

int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

解释

  1. 引入 FetchContent 模块

    include(FetchContent)
    
  2. 声明多个库
    使用 FetchContent_Declare 为每个库声明其存储库位置和版本。

    FetchContent_Declare(
      googletest
      GIT_REPOSITORY https://github.com/google/googletest.git
      GIT_TAG release-1.11.0
    )
    
    FetchContent_Declare(
      fmt
      GIT_REPOSITORY https://github.com/fmtlib/fmt.git
      GIT_TAG 8.0.1
    )
    
  3. 下载并解压所有声明的内容
    使用 FetchContent_MakeAvailable 下载并解压所有已声明的库。

    FetchContent_MakeAvailable(googletest fmt)
    
  4. 使用下载的库
    将下载的库链接到您的项目中。

    target_link_libraries(my_project PRIVATE fmt::fmt)
    target_link_libraries(test_main PRIVATE gtest_main)
    

通过这种方式,您可以轻松地管理和使用多个外部库。每个库的声明和下载是独立的,FetchContent 模块会自动处理依赖关系和构建顺序。

相关推荐

  1. React Router(用法介绍

    2024-06-08 06:46:03       57 阅读
  2. torch.where用法介绍

    2024-06-08 06:46:03       61 阅读
  3. PyTorch 常见用法介绍

    2024-06-08 06:46:03       39 阅读
  4. `DeferredResult`用法简单介绍

    2024-06-08 06:46:03       23 阅读
  5. QVariant用法介绍

    2024-06-08 06:46:03       31 阅读
  6. sklearn.pipeline的用法介绍

    2024-06-08 06:46:03       25 阅读
  7. 【python】pillow (PIL)库的用法介绍

    2024-06-08 06:46:03       54 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-08 06:46:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-08 06:46:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-08 06:46:03       87 阅读
  4. Python语言-面向对象

    2024-06-08 06:46:03       96 阅读

热门阅读

  1. Linux入门学习指南

    2024-06-08 06:46:03       27 阅读
  2. 设计模式之模板方法模式

    2024-06-08 06:46:03       29 阅读
  3. Linux基于V4L2的视频捕捉

    2024-06-08 06:46:03       33 阅读
  4. Unity3D DOTS 10W GPU Intancing 动画与合批优化详解

    2024-06-08 06:46:03       28 阅读
  5. Excel中的SUMPRODUCT函数:使用方法与案例分析

    2024-06-08 06:46:03       30 阅读
  6. 【MyBatisPlus条件构造器】

    2024-06-08 06:46:03       29 阅读
  7. [DT] 翻译笔记

    2024-06-08 06:46:03       24 阅读
  8. uniapp vue 隐藏button的边框

    2024-06-08 06:46:03       32 阅读
  9. 零、测试开发前置知识

    2024-06-08 06:46:03       28 阅读
  10. 【常用工具系列】Git 教程——从入门到大师

    2024-06-08 06:46:03       45 阅读
  11. Freemarker

    2024-06-08 06:46:03       27 阅读
  12. MySQL学习——获取数据库和表格的信息

    2024-06-08 06:46:03       30 阅读
  13. solidity的modifier修饰符

    2024-06-08 06:46:03       22 阅读