当前位置: 首页 > news >正文

使用CMake构建一个简单的C++项目

文章目录

  • 一. 构建一个简单的项目
  • 二. 构建过程
    • 1. 创建程序源文件
    • 2. 编写CMakeList.txt文件
    • 3. 构建项目并编译源代码
  • 附件

一. 构建一个简单的项目

最基本的CMake项目是从单个源代码文件构建的可执行文件。对于像这样的简单项目,只需要一个包含三个命令的CMakeLists.txt文件。注意:虽然CMake支持大写、小写和混合大小写命令,但小写命令是首选命令,并将在整个教程中使用。

任何项目的顶级CMakeLists.txt都必须通过使用CMake_minimum_required()命令指定最低CMake版本来启动。这将建立策略设置,并确保以下CMake函数使用兼容版本的CMake运行。为了启动一个项目,我们使用project()命令来设置项目名称。每个项目都需要此调用,并且应在cmake_minimum_required()之后立即调用。正如我们稍后将看到的,此命令还可以用于指定其他项目级别的信息,如语言或版本号。最后,add_executable()命令告诉CMake使用指定的源代码创建一个可执行文件

二. 构建过程

1. 创建程序源文件

源文件包含两个:

  • tutorial.cxx
  • TutorialConfig.h.in
// TutorialConfig.h.in文件内容
// 定义了两个变量,可以在cmake构建项目时进行相应的替换
#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"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]);// 计算平方根const double outputValue = sqrt(inputValue);std::cout << "The square root of " << inputValue << " is " << outputValue<< std::endl;return 0;
}

2. 编写CMakeList.txt文件

# 设置CMake最低版本为3.10
cmake_minimum_required(VERSION 3.10)# 设置项目的版本为1.0
project(Tutorial VERSION 1.0)# 设置变量CMAKE_CXX_STANDARD为11
# 设置变量CMAKE_CXX_STANDARD_REQUIRED为True
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)# 创建一个可执行文件,名为Tutorial.exe
add_executable(Tutorial tutorial.cxx)# 使用target_include_directories指明程序的头文件所在目录
target_include_directories(Tutorial PUBLIC "${PROJECT_BINARY_DIR}")

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

未构建项目的情况下,源文件夹目录中仅有三个文件,如下:
在这里插入图片描述

  1. 在程序原文件夹中创建一个文件夹,用于保存构建的项目

    mkdir Step1_build
    

    在这里插入图片描述

  2. 进入创建好的文件夹中,使用cmake构建项目

    cd Step1_build
    cmake ..
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. 使用cmake生成项目,生成可执行文件

    cmake --build .
    

    在这里插入图片描述

  4. 进入构建文件夹(Step1_build),执行可执行程序Tutorial.exe

    cd Debug
    Tutorial 10
    

    在这里插入图片描述

附件

源代码下载

相关文章:

使用CMake构建一个简单的C++项目

文章目录 一. 构建一个简单的项目二. 构建过程1. 创建程序源文件2. 编写CMakeList.txt文件3. 构建项目并编译源代码 附件 一. 构建一个简单的项目 最基本的CMake项目是从单个源代码文件构建的可执行文件。对于像这样的简单项目&#xff0c;只需要一个包含三个命令的CMakeLists…...

图论06-【无权无向】-图的遍历并查集Union Find-力扣695为例

文章目录 1. 代码仓库2. 思路2.1 UF变量设计2.2 UF合并两个集合2.3 查找当前顶点的父节点 find(element) 3. 完整代码 1. 代码仓库 https://github.com/Chufeng-Jiang/Graph-Theory 2. 思路 2.1 UF变量设计 parent数组保存着每个节点所指向的父节点的索引&#xff0c;初始值为…...

什么是卷积神经网络?解决了什么问题?

什么是卷积神经网络&#xff1f; 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种深度神经网络模型&#xff0c;主要用于图像识别、语音识别和自然语言处理等任务。它通过卷积层、池化层和全连接层来实现特征提取和分类。 解决了什么问…...

Golang数组:全面指南与实际示例

揭示Golang数组的威力&#xff1a;从基础到高级技巧 Golang数组是数据存储的基本构建块&#xff0c;为开发人员提供了多种可能性。在这篇正式的博客文章中&#xff0c;我们将探讨Golang数组&#xff0c;从基础知识到高级技巧。通过实际示例和正式的语气&#xff0c;我们将揭示…...

程序连接oracle查询数据的环境配置

连接oracle 数据库真麻烦&#xff0c;还是MySQL方便 Oracle Instant Client 这个东西的版本跟oracle的版本是有讲究的&#xff0c;引用文档的说明 Oracle 标准的客户端-服务器网络互操作性允许不同版本的 Oracle 客户端和 Oracle 数据库之间的连接。有关经过认证的配置&#…...

【BIGRU预测】基于双向门控循环单元的多变量时间序列预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

RDD算子操作(基本算子和常见算子)

目录 一、基本算子 1.map算子 2.flatMap算子 3.filter算子 4.foreach算子 5.saveAsTextFile算子 6.redueceByKey算子 二、常用Transformation算子 1.mapValues算子 2.groupBy算子 3.distinct算子 4.union算子 5.join算子 6.intersection算子 7.glom算子 8.groupByKey算…...

互联网Java工程师面试题·Java 面试篇·第五弹

目录 79、适配器模式和装饰器模式有什么区别&#xff1f; 80、适配器模式和代理模式之前有什么不同&#xff1f; 81、什么是模板方法模式&#xff1f; 82、什么时候使用访问者模式&#xff1f; 83、什么时候使用组合模式&#xff1f; 84、继承和组合之间有什么不同&#…...

常见的测试理论面试问题

请解释软件生存周期是什么&#xff1f; 软件生存周期是指从软件开发到维护的过程&#xff0c;包括可行性研究、需求分析、软件设计、编码、测试、发布和维护等活动。这个过程也被称为“生命周期模型”。 软件测试的目的是什么&#xff1f; 软件测试的目的是发现软件中的错误…...

把JS中的map方法玩出花来

一 map是什么 map(callbackFn) map(callbackFn, thisArg)map() 方法是一个迭代方法。它为数组中的每个元素调用一次提供的 callbackFn 函数&#xff0c;并用结果构建一个新数组。 参数 callbackFn 数组中的每个元素执行的函数。它的返回值作为一个元素被添加为新数组中。该…...

液晶显示计算器(延时程序)

#include "delay.h" /*------------------------------------------------ uS延时函数&#xff0c;含有输入参数 unsigned char t&#xff0c;无返回值 unsigned char 是定义无符号字符变量&#xff0c;其值的范围是 0~255 这里使用晶振12M&#xff0c;精确延时请…...

线性代数2:梯队矩阵形式

图片来自 Europeana on Unsplash 一、前言 欢迎阅读的系列文章的第二篇文章&#xff0c;内容是线性代数的基础知识&#xff0c;线性代数是机器学习背后的基础数学。在我之前的文章中&#xff0c;我介绍了线性方程和系统、矩阵符号和行缩减运算。本文将介绍梯队矩阵形式&#xf…...

【JavaEE】网络编程(网络编程基础、Socket套接字)

一、网络编程基础 1.1、什么是网络编程&#xff1f; 网络编程&#xff0c;指网络上的主机&#xff0c;通过不同的进程&#xff0c;以编程的方式实现网络通信&#xff08;或称为网络数据传输&#xff09; 注意&#xff1a;我们只要满足进程不同就行&#xff1b;所以即便是同一…...

Node学习笔记之模块化

一、介绍 1.1 什么是模块化与模块 ? 将一个复杂的程序文件依据一定规则&#xff08;规范&#xff09;拆分成多个文件的过程称之为 模块化 其中拆分出的 每个文件就是一个模块 &#xff0c;模块的内部数据是私有的&#xff0c;不过模块可以暴露内部数据以便其他 模块使用 1…...

用matlab求解线性规划

文章目录 1、用单纯形表求解线性规划绘制单纯形表求解&#xff1a; 2、用matlab求解线性规划——linprog()函数问题&#xff1a;补充代码&#xff1a;显示出完整的影子价格向量 1、用单纯形表求解线性规划 求解线性规划 m i n − 3 x 1 − 4 x 2 x 3 min -3x_1-4x_2x_3 min−…...

antd获取/更改form表单数据(表单域数据)

创建ref引用 formRef React.createRef();表单和ref绑定 //ref{this.formRef} 先给Form <Form ref{this.formRef} name"control-ref" onFinish{this.onFinish}><Form.Item name"name" label"Name" rules{[{ required: true }]}>…...

Go学习第三章——运算符与进制

Go学习第三章——运算符与进制 1 算术运算符2 关系运算符3 逻辑运算符4 赋值运算符5 其他运算符5.1 位运算符5.2 跟指针有关的运算符 6 运算符的优先级7 获取用户终端输入8 进制转换8.1 进制基本使用8.2 进制之间的转换8.3 原码 反码 补码8.4 位运算符详解 运算符是—种特殊的符…...

H3C IMC dynamiccontent.properties.xhtm 远程命令执行

我举手向苍穹&#xff0c;并非一定要摘星取月&#xff0c;我只是需要这个向上的、永不臣服的姿态。 构造payload&#xff1a; /imc/javax.faces.resource/dynamiccontent.properties.xhtml pfdrtsc&lnprimefaces&pfdriduMKljPgnOTVxmOB%2BH6%2FQEPW9ghJMGL3PRdkfmbii…...

【技能树笔记】网络篇——练习题解析(八)

目录 前言 一、LAN技术 1.1 堆叠与集群 1.2 MSTP的特点 二、WAN技术 2.1 PPP链路建立 2.2 PPPoE 2.3 组播 2.3.1 组播的IP 2.3.2 组播分发树 2.3.3 组播协议 三、IPv6基础 3.1 IPv6地址 3.2 IPv6协议 3.3 IPv6过渡技术 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1…...

laravel框架介绍(二)

方法1.windows 可以直接下载 Composer-Setup.exe 方法2.配置php.exe目录环境变量,下载 composer.phar和php.exe平级目录, 新建 composer.bat 文件编辑以下内容 php "%~dp0composer.phar" %* 运行composer.bat ,出现版本号为成功 执行 composer self-update 以保持 Co…...

如何在云主机上安装Oracle 19c_公网IP绑定与安全组端口开放

Oracle 19c 连不上需依次检查&#xff1a;监听是否绑定公网IP&#xff08;修改listener.ora中HOST为0.0.0.0或公网IP并lsnrctl reload&#xff09;、系统防火墙是否放行1521端口、tnsnames.ora中HOST地址匹配客户端网络位置&#xff08;公网/内网&#xff09;、以及listener.or…...

【YOLOv8 改进涨点 】RT-DETR架构-通道自适应缩放机制优化主干网络结构

一、引言 本文提出了一项针对轻量级目标检测网络的改进方案——通过引入通道自适应缩放机制优化主干网络结构。该机制源自RT-DETR架构中曾使用的特征提取策略,经过二次创新后适配到YOLOv8框架。 当我们将重新设计的PulseNetV2(脉动网络V2)集成至YOLOv8n作为特征提取主干时…...

不止是部署:Seafile 12.0社区版深度定制与第三方系统集成实战(Java API + 自动登录)

不止是部署&#xff1a;Seafile 12.0社区版深度定制与第三方系统集成实战 当企业IT系统发展到一定规模&#xff0c;文件管理往往会成为效率瓶颈。传统FTP服务器权限混乱&#xff0c;公有云存储又面临数据主权风险。Seafile作为开源企业网盘解决方案&#xff0c;凭借其版本控制、…...

如何永久保存微信聊天记录:留痕工具终极指南

如何永久保存微信聊天记录&#xff1a;留痕工具终极指南 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg …...

RMBG-2.0功能体验:上下分栏对比,直观查看抠图效果

RMBG-2.0功能体验&#xff1a;上下分栏对比&#xff0c;直观查看抠图效果 1. 为什么选择RMBG-2.0进行背景移除&#xff1f; 在日常工作中&#xff0c;我们经常需要处理各种图片背景移除的需求。无论是电商商品图、人像照片还是设计素材&#xff0c;传统的抠图工具往往存在边缘…...

Palantir的Ontology:从静态知识图谱到动态业务引擎的跃迁

1. 传统知识图谱的局限性 知识图谱技术发展至今已有二十余年历史&#xff0c;从早期的语义网到现在的商业知识图谱&#xff0c;这项技术始终面临一个根本性挑战&#xff1a;静态性。传统知识图谱就像一座精心设计的图书馆&#xff0c;虽然藏书丰富、分类明确&#xff0c;但所有…...

从汽车到工厂:深入浅出解析PTP在TSN和AUTOSAR中的实现差异

从汽车到工厂&#xff1a;深入浅出解析PTP在TSN和AUTOSAR中的实现差异 在工业自动化和汽车电子领域&#xff0c;时间同步技术正成为支撑下一代智能系统的关键基础设施。想象一下&#xff0c;当一辆自动驾驶汽车以120公里时速行驶时&#xff0c;其传感器、控制器和执行器之间的时…...

XUnity AutoTranslator完整指南:一键实现Unity游戏多语言实时翻译

XUnity AutoTranslator完整指南&#xff1a;一键实现Unity游戏多语言实时翻译 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator 想要畅玩外语游戏却苦于语言障碍&#xff1f;XUnity AutoTranslator作为一款…...

终极DefectDojo故障排除指南:解决95%的部署和运行问题

终极DefectDojo故障排除指南&#xff1a;解决95%的部署和运行问题 【免费下载链接】django-DefectDojo Open-Source Unified Vulnerability Management, DevSecOps & ASPM 项目地址: https://gitcode.com/gh_mirrors/dj/django-DefectDojo DefectDojo作为一款开源的…...

仅限72小时!奇点大会闭门报告流出:多模态内容生成的3大伦理红线与5条合规生成铁律

第一章&#xff1a;2026奇点智能技术大会&#xff1a;多模态内容生成 2026奇点智能技术大会(https://ml-summit.org) 多模态生成范式的演进 2026年大会聚焦于统一架构驱动的跨模态对齐技术&#xff0c;强调文本、图像、音频与3D几何信号在隐空间中的联合表征学习。主流模型已…...