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

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

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

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

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

二. 构建过程

1. 创建程序源文件

  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 <cmath>
    #include <iostream>
    #include <string>
    
    // 添加头文件
    #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. 次级文件夹内容
    在这里插入图片描述

    // mysqrt.h文件内容
    #pragma once
    
    namespace mathfunctions {
    namespace detail {
    double mysqrt(double x);
    }
    }
    
    
    // mysqrt.cxx文件内容
    #include "mysqrt.h"
    #include <iostream>
    
    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 <cmath>
    
    // 将引入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

在这里插入图片描述

附件

源代码下载

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当你在 CMake 中创建一个包含项目和动态C++ 项目时,你需要按照以下步骤进行配置。 首先,创建一个主项目的文件夹,并在该文件夹中创建一个 CMakeLists.txt 文件。在 CMakeLists.txt 文件中,添加以下内容: ```cmake cmake_minimum_required(VERSION 3.12) project(MainProject) # 添加子项目 add_subdirectory(subproject) # 添加可执行文件 add_executable(main main.cpp) # 链接子项目生成的动态 target_link_libraries(main PRIVATE subproject) ``` 在上面的代码中,`add_subdirectory(subproject)` 命令会将名为 "subproject" 的子项目添加到主项目中。 然后,创建一个子项目的文件夹,并在该文件夹中创建一个 CMakeLists.txt 文件。在子项目CMakeLists.txt 文件中,添加以下内容: ```cmake cmake_minimum_required(VERSION 3.12) project(SubProject) # 添加源文件 add_library(subproject SHARED subproject.cpp) ``` 在上面的代码中,`add_library(subproject SHARED subproject.cpp)` 命令会将名为 "subproject" 的源文件编译为一个动态。 最后,在主项目的根目录下创建一个名为 "main.cpp" 的文件,作为主项目的入口点。 这样配置后,你可以使用以下命令来构建和运行项目: ```bash mkdir build cd build cmake .. make ./main ``` 这将会构建项目和子项目,并将子项目生成的动态链接到主项目的可执行文件中。你可以根据自己的实际需求在主项目和子项目中添加更多的源文件、依赖等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AoDeLuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值