CMake学习(二):使用CMake构建包含其他库的C++项目

文章目录

  • 一. 构建一个包含其他库的项目
  • 二. 构建过程
    • 1. 创建程序源文件
    • 2. 构建项目并编译源代码
  • 附件

一. 构建一个包含其他库的项目

CMake学习(一):使用CMake构建一个简单的C++项目

在这上一篇文章中,我们已经了解了如何使用CMake创建一个基本项目。在这一步中,我们将学习如何在项目中创建和使用库。我们还将了解库是如何进行导入的。

要在CMake中添加库,要使用add_library()命令并指定应组成库的源文件。
我们可以用一个或多个子目录来组织项目,而不是将所有源文件放在一个目录中。在这种情况下,我们将专门为我们的库创建一个子目录。在这里,我们可以添加一个新的CMakeLists.txt文件和一个或多个源文件。在顶级CMakeLists.txt文件中,我们将使用add_subdirectory()命令将子目录添加到构建中。一旦创建了库,就可以通过target_include_directories()target_link_libraries()将库连接到我们的可执行目标。

二. 构建过程

1. 创建程序源文件

  1. 初级文件夹内部内容
    CMake学习(二):使用CMake构建包含其他库的C++项目_第1张图片

    // TutorialConfig.h.in文件内容
    // the configured options and settings for Tutorial
    #define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
    #define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
    
    // tutorial.cxx文件内容
    #include 
    #include 
    #include 
    
    // 添加头文件
    #include "TutorialConfig.h"
    #include "MathFunctions.h"
    
    int main(int argc, char* argv[])
    {
      if (argc < 2) {
        std::cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << "."
                  << Tutorial_VERSION_MINOR << std::endl;
        std::cout << "Usage: " << argv[0] << " number" << std::endl;
        return 1;
      }
    
      // 转换输入为double
      const double inputValue = std::stod(argv[1]);
    
      // 通过mathfunctions调用开方函数mathfunctions::sqrt
      const double outputValue = mathfunctions::sqrt(inputValue);
      
      std::cout << "The square root of " << inputValue << " is " << outputValue
                << std::endl;
      return 0;
    }
    
    
    # CMakeList.txt文件内容
    cmake_minimum_required(VERSION 3.10)
    
    # 设置项目名称以及版本号
    project(Tutorial VERSION 1.0)
    
    # 定义cc++版本
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED True)
    
    # 通过使用configure_file将TutorialConfig.h.in中的内容拷贝到TutorialConfig.h中,并将其中需要替换的部分进行替换
    configure_file(TutorialConfig.h.in TutorialConfig.h)
    
    # 添加子目录
    add_subdirectory(MathFunctions)
    
    # 创建一个可执行文件,名为Tutorial.exe
    add_executable(Tutorial tutorial.cxx)
    
    # 使用target_link_libraries链接库与可执行文件
    target_link_libraries(Tutorial PUBLIC MathFunctions)
    
    # 添加库文件所在目录
    target_include_directories(Tutorial PUBLIC
                              "${PROJECT_BINARY_DIR}"
                              "${PROJECT_SOURCE_DIR}/MathFunctions"
                              )
    						 
    
    
  2. 次级文件夹内容
    CMake学习(二):使用CMake构建包含其他库的C++项目_第2张图片

    // mysqrt.h文件内容
    #pragma once
    
    namespace mathfunctions {
    namespace detail {
    double mysqrt(double x);
    }
    }
    
    
    // mysqrt.cxx文件内容
    #include "mysqrt.h"
    #include 
    
    namespace mathfunctions {
    namespace detail {
    // a hack square root calculation using simple operations
    double mysqrt(double x)
    {
      if (x <= 0) {
        return 0;
      }
    
      double result = x;
    
      // do ten iterations
      for (int i = 0; i < 10; ++i) {
        if (result <= 0) {
          result = 0.1;
        }
        double delta = x - (result * result);
        result = result + 0.5 * delta / result;
        std::cout << "Computing sqrt of " << x << " to be " << result << std::endl;
      }
      return result;
    }
    }
    }
    
    
    // MathFunctions.h文件内容
    #pragma once
    
    namespace mathfunctions {
    double sqrt(double x);
    }
    
    
    // MathFunctions.cxx文件内容
    #include "MathFunctions.h"
    #include 
    
    // 将引入mysqrt.h的代码放入预编译代码片段中
    #ifdef USE_MYMATH
      #include "mysqrt.h"
    #endif
    
    namespace mathfunctions {
    double sqrt(double x)
    {
      // 根据预定义的USE_MYMATH,选择是否使用detail::mysqrt函数
    #ifdef USE_MYMATH
      return detail::mysqrt(x);
    #else
      return std::sqrt(x);
    #endif
    }
    }
    
    
    # CMakeList.txt文件内容
    # 将库文件MathFunctions添加到项目中
    add_library(MathFunctions MathFunctions.cxx)
    
    # 创建一个选项,可以在构建项目时是否创建MathFunctions
    option(USE_MYMATH "Use tutorial provided math implementation" ON)
    
    # 根据选项进行选择是否进行内部代码
    if (USE_MYMATH)
      #在源码中添加预编译USE_MYMATH,类似于在c++文件中的#define USE_MYMATH
      target_compile_definitions(MathFunctions PRIVATE "USE_MYMATH")
      
      # 添加mysqrt.cxx
      add_library(SqrtLibrary STATIC mysqrt.cxx)
      
      # 链接库
      target_link_libraries(MathFunctions PRIVATE SqrtLibrary)
    endif()
    

2. 构建项目并编译源代码

mkdir Step2_build
cd Step2_build
cmake ..
cmake --build .
cd Debug
Tutorial 16

CMake学习(二):使用CMake构建包含其他库的C++项目_第3张图片

附件

源代码下载

你可能感兴趣的:(Cmaker,c++)