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

编程入门 行业动态 更新时间:2024-10-07 20:27:31

CMake学习(二):使用CMake构建包含其他库的C++<a href=https://www.elefans.com/category/jswz/34/1771421.html style=项目"/>

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. 初级文件夹内部内容

    // 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;}// 转换输入为doubleconst double inputValue = std::stod(argv[1]);// 通过mathfunctions调用开方函数mathfunctions::sqrtconst 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 oncenamespace 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 iterationsfor (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 oncenamespace mathfunctions {
    double sqrt(double x);
    }
    // MathFunctions.cxx文件内容
    #include "MathFunctions.h"
    #include <cmath>// 将引入mysqrt.h的代码放入预编译代码片段中
    #ifdef USE_MYMATH#include "mysqrt.h"
    #endifnamespace mathfunctions {
    double sqrt(double x)
    {// 根据预定义的USE_MYMATH,选择是否使用detail::mysqrt函数
    #ifdef USE_MYMATHreturn detail::mysqrt(x);
    #elsereturn 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_MYMATHtarget_compile_definitions(MathFunctions PRIVATE "USE_MYMATH")# 添加mysqrt.cxxadd_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++项目

本文发布于:2023-12-04 17:45:50,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1661724.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:项目   CMake

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!