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

news2025/4/12 14:48:23

文章目录

  • 一. 构建一个包含其他库的项目
  • 二. 构建过程
    • 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;
      }
    
      // 转换输入为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

在这里插入图片描述

附件

源代码下载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1123304.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为数通方向HCIP-DataCom H12-831题库(多选题:21-40)

第21题 网络管理员A希望使用ACL匹配特定的路由条目,请问以下哪些路由条目将被图中的ACL规侧匹配? acl number 2000 rule 10 permit source 10.0.0.0 0.0.6.0A、10.0.0.1/32 B、10.0.0.0/24 C、10.0.1.0/24 D、10.0.2.0/24 答案: 解析: 通配符十进制6转换二进制为00000110,…

从Excel到智能化:智能报表的演进与未来发展趋势

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 报表的迭代历程 报表工具的诞生与计算机技术的出现和信息技术的进步密不可分。下图是报…

javascript追加标签

页面样式&#xff08;初始化&#xff09;&#xff1a; 开头追加标签&#xff1a; 结尾追加标签&#xff1a; 开头结尾追加标签&#xff1a; js代码&#xff1a; 样式展示&#xff1a; js追加标签

议题征集|The Open Group 2023亚太区年度颁奖盛典暨ESG架构年度大会诚邀演讲嘉宾!

每个人心中 都有各自对ESG架构管理的想象与理解 我们期待用一场汇聚 真知灼见与探索实践的盛典 重新定义架构的奇妙 ▼ 在全球可持续发展浪潮下&#xff0c;ESG目标&#xff08;环境、社会和治理&#xff09;的重要性愈发凸显。越来越多的企业认识到&#xff0c;以ESG为基…

第二十章 综合案例——基于多态的职工管理系统

1、管理系统需求 职工管理系统可以用来管理公司内所有员工的信息 本教程主要利用C来实现一个基于多态的职工管理系统 公司中职工分为三类&#xff1a;普通员工、经理、老板&#xff0c;显示信息时&#xff0c;需要显示职工编号、职工姓名、职工岗位、以及职责 普通员工职责&…

Python —— hou.NetworkItem class

在一个network内&#xff0c;所有可见元素的基类&#xff1b; 此类没有方法&#xff0c;仅作为 hou.NetworkMovabelItem、hou.NodeConnection 基类存在&#xff0c;这两个子类在网络编辑器内均是可见的&#xff0c;是没有真正有意义的基类的&#xff1b;通过提供一个公共的基类…

如何避免阿里云对象储存OSS被盗刷

网站app图片的云端存储离不开对象存储oss,而最难为的问题就是app做的出名了&#xff0c;少不了同行的攻击&#xff0c;包含ddos&#xff0c;cc攻击以及oss外链被盗刷&#xff01; 防盗链功能通过设置Referer白名单以及是否允许空Referer&#xff0c;限制仅白名单中的域名可以访…

【stm32】stm32MX定时器

一、在STM32MXCube中配置参数 利用TIM2实现间隔定时&#xff0c;每隔0.2秒将LED1的开关状态翻转 二、在函数里面写翻转 1、寻找定时中断的回调函数 2、htim->Instance指的是*htim里面的实例 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){if(htim->I…

聚观早报 | OPPO Find N3首发;AI带来新红利

【聚观365】10月23日消息 OPPO Find N3首发 AI带来新红利 丰田展示EPU纯电皮卡 MIUI官微改名为“小米澎湃 OS” 沙特汽车工厂建立 OPPO Find N3首发 近日OPPO正式发布Find N3折叠旗舰&#xff0c;首发搭载获得国密二级认证的汇顶科技独立安全芯片GSEA0。得益于该芯片拥有…

数组遍历里多个radio-group的问题解决

对于数组的遍历的单选组合问题如下 <view class"swiper-box-list"><view v-for"obj in firstTabsInfo" :key"obj.productId"><view class"secondProduct"><view class"menu-topic-bottom-color">&…

win11系统如何访问ie浏览器(不用额外安装IE浏览器,使用win11系统自带功能即可访问ie浏览器)

文章目录 一、背景二、win11系统访问IE浏览器步骤 一、背景 笔记本电脑win11系统中已经将IE浏览器抛弃了&#xff0c;默认安装的是Edge浏览器&#xff0c;我的电脑是华为 matebook 14s, 系统win11家庭中文版&#xff0c;已经不支持安装IE浏览器了&#xff0c;在有Edge浏览器的…

会声会影2023破解版安装包下载附带补丁注册机

提到视频剪辑软件&#xff0c;浮现在我们脑海的可能就是满屏的功能键和眼花缭乱的操作界面。类似pr、AE之类的视频软件&#xff0c;操作界面看起来十分复杂&#xff0c;很多用户上手困难。而会声会影界面简单&#xff0c;功能齐全&#xff0c;也能完成专业级的视频制作。操作简…

【C++】引用’‘的深入解析

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

QT QGLWidge

QGLWidget 学习 前言1.四边形 QGLWidget 2*32. 正方体 1*2前言 1.四边形 QGLWidget 2*3 坐标 效果 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除屏幕和深度缓存glLoadIdentity(); //重置当前的模型观察矩阵glTranslate…

ElasticSearch安装、插件介绍及Kibana的安装与使用详解

ElasticSearch安装、插件介绍及Kibana的安装与使用详解 1.安装 ElasticSearch 1.1 安装 JDK 环境 因为 ElasticSearch 是用 Java 语言编写的&#xff0c;所以必须安装 JDK 的环境&#xff0c;并且是 JDK 1.8 以上&#xff0c;具体操作步骤自行百度 安装完成查看 java 版本 …

算法基础学习|前缀和差分

前缀和 代码模板 一维前缀和模板 S[i] a[1] a[2] ... a[i] a[l] ... a[r] S[r] - S[l - 1]二维前缀和模板 S[i, j] 第i行j列格子左上部分所有元素的和 以(x1, y1)为左上角&#xff0c;(x2, y2)为右下角的子矩阵的和为&#xff1a; S[x2, y2] - S[x1 - 1, y2] - S[x2, …

如何最有效地使用ChatGPT:提问技巧与策略

前言 在如今信息技术高速发展的时代&#xff0c;像ChatGPT这样的大型自然语言处理模型为我们提供了一个强大的工具&#xff0c;以获取各种信息和答案。然而&#xff0c;要充分利用这一工具&#xff0c;您需要掌握一些提问技巧与策略&#xff0c;以确保获得最准确和有用的回答。…

人员定位在安全生产管理中的应用

人员定位技术正在成为安全生产管理中的重要工具&#xff0c;它利用各种定位技术来获取人员的位置信息&#xff0c;帮助管理人员更好地监控和保障人员安全。 关于人员定位管理 在安全管理工作中&#xff0c;人员定位技术主要用来跟踪和监测特定区域内的员工或来访者的位置&#…

CleanMyMac X免费macOS清理系统管家

近些年伴随着苹果生态的蓬勃发展&#xff0c;越来越多的用户开始尝试接触Mac电脑。然而很多人上手Mac后会发现&#xff0c;它的使用逻辑与Windows存在很多不同&#xff0c;而且随着使用时间的增加&#xff0c;一些奇奇怪怪的文件也会占据有限的磁盘空间&#xff0c;进而影响使用…

wordpress数据库迁移Invalid default value for ‘comment_date‘

问题说明 最近在往新的电脑上迁移一个wordpress网站&#xff0c;在往新电脑上的mysql数据库中导入数据时&#xff0c;报错&#xff1a;1067 - Invalid default value for comment_date。 异常分析 这个错误的字面意思就是字段‘comment_date’的默认值是无效的&#xff0c;于…