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

news2024/11/24 10:59:31

文章目录

  • 一. 构建一个简单的项目
  • 二. 构建过程
    • 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
    

    在这里插入图片描述

附件

源代码下载

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

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

相关文章

QT的Qporcess功能的使用

具体实现代码如下&#xff1a; #include <QProgressBar>//必须要包含的头文件 #include <QProcess>// 创建一个QProgressBar对象QProgressBar *progressBar new QProgressBar(this);QProcess *proces;process_shownew process;// 设置进度条的最小值和最大值prog…

YOLOv5论文作图教程(1)— 软件介绍及下载安装(包括软件包+下载安装详细步骤)

前言:Hello大家好,我是小哥谈。在学习YOLOv5算法的过程中,很多同学都有发表论文的需求。作为文章内容的支撑,图表是最直接的整合数据的工具,能够更清晰地反映出研究对象的结果、流程或趋势。在发表论文的时候,审稿人除了关注论文的内容和排版外,也会审核图表是否清晰美观…

按摩 推拿上门服务小程序源码 家政上门服务系统源码

按摩 推拿上门服务小程序源码 家政上门服务系统源码 上门服务系统是一款基于互联网和移动应用的高端家政服务预订平台&#xff0c;它集成了用户、服务员、客户三方的需求于一体&#xff0c;为广大市民提供方便、高效、安全、舒适的家居服务体验&#xff0c;让你在家当皇帝&…

征战EDU证书站

1.前言&#xff1a; 挖了一段时间EDU老破小的站&#xff0c;也该拿证书站下手了。下手的第一个目标&#xff0c;那必然是漏洞排行榜第一的某交大&#xff01;&#xff01;&#xff01; 2.信息搜集 想快速挖到漏洞&#xff0c;必须信息搜集全面。如果信息搜集不到位不全面&…

YOLO V8语义分割模型部署

目录 1 配置pytorch环境 2 配置yolo环境 3 测试yoloV8的语义分割模型 1 配置pytorch环境 我的电脑为Y9000P 4090&#xff0c;英伟达显卡驱动版本为525.105.17&#xff0c;驱动显示最高的cuda版本号为12.0&#xff0c;cuda版本为11.6&#xff0c;cudnn版本号为8.5.0。Anaconda…

如何将音频与视频分离

您一定经历过这样的情况&#xff1a;当你非常喜欢视频中的背景音乐时&#xff0c;希望将音频从视频中分离出来&#xff0c;以便你可以在音乐播放器中收听音乐。有没有一种有效的方法可以帮助您快速从视频中提取音频呢&#xff1f;当然是有的啦&#xff0c;在下面的文章中&#…

Windows命令行窗口修改字体方法

问题&#xff1a;嫌弃原来的字体太丑&#xff0c;不好看&#xff0c;影响心情 长得丑还天天在我眼前晃悠&#xff1a; 改一改字体 输入命令&#xff1a; chcp 437 把字体换成consola 学习的心情都变好了

美国亚马逊UL60335认证怎么办理,费用是多少

UL60335认证是由美国安全实验室&#xff08;UnderwritersLaboratories&#xff09;颁发的&#xff0c;它对各类家用电器进行严格的测试和认证&#xff0c;确保其在正常使用情况下不会给消费者带来任何伤害。 本文将从不同的角度来叙述亚马逊UL60335认证的重要性和成败因素。 1.…

Kafka快速入门(最新版3.6.0)

文章目录 一、初识MQ1.1 什么是MQ1.2 同步和异步通讯1.1.1 同步通讯1.1.2 异步通讯 1.3 技术对比1.4 MQ的两种模式 二、初识Kafka2.1 Kafka的使用场景2.2 Kafka基本概念2.3 Topic与Partition 三、Kafka基本使用3.1 部署前的准备3.2 启动kafka服务器3.3 Kafka核心概念之Topic3.4…

laravel队列

laravel redis队列 1、创建job队列任务 php artisan make:job StoreUser执行上述命令后&#xff0c;会生成app/Jobs/StoreUser.php文件&#xff0c;编辑文件内容如下&#xff1a; <?phpnamespace App\Jobs;use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queu…

JavaScript基础知识(二)

JavaScript基础知识&#xff08;二&#xff09; 一、ES2015 基础语法1.变量2.常量3.模板字符串4.结构赋值 二、函数进阶1. 设置默认参数值2. 立即执行函数3. 闭包4. 箭头函数 三、面向对象1.面向对象概述2.基本概念3.新语法与旧语法4.ES5 面向对象的知识4.1 ES5构造函数4.2 原型…

一秒开挂!工厂模式让你告别重复代码!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章引言 一、工…

大模型开发07:LangChain 开发基础

大模型开发07:LangChain 开发基础 一、Model I/O 输入输出 任何语言模型应用程序的核心元素是什么?LangChain 提供了与任何语言模型交互的构建块。 Prompts: 模板化、动态选择和管理模型输入Language models: 通过通用的接口访问大模型Output parsers: 大模型输出解析模板化…

Oracle Enterprise Manager 认证列表

认证列表的查找方法参见Accessing the Enterprise Manager Certification Matrix。 认证分为对于OMS的&#xff0c;和对于Agent的。 OMS和Agent的描述见这里。 Oracle Management Agent The Management Agent is an integral software component that enables you to conver…

开源微信小程序商城源码PHP带后台管理——构建高效电商平台的基石

随着移动互联网的快速发展&#xff0c;微信小程序作为一种新型的电商形态&#xff0c;正逐渐成为商业领域的一种重要力量。对于许多商家来说&#xff0c;拥有一个功能完善、安全可靠的小程序商城源码至关重要。分享一款开源的微信小程序商城源码PHP&#xff0c;春哥七合一DIY小…

协作机器人应用场景

UR 双臂协作机器人在有人环境中 作业 ABB 双臂协作机器人进行医疗康复作业 KUKA iiwa 协作机器人拖动示教作业 机器人 – 环境物理交互控制要 求机器人具有力感知能力&#xff01;&#xff01; 在传 统的操作任务中&#xff0c;机械臂末端的静态 接触力可以通过多维力传感器…

【什么是高斯分布?还有什么分布?他们的用途是什么?】

高斯分布 高斯分布,也被称为正态分布或钟形曲线,是统计学中最为常见和重要的连续概率分布之一。高斯分布的概率密度函数(PDF)是: 其中: ( x ) 是变量( \mu ) 是分布的均值(mean)( \sigma ) 是标准差(standard deviation)( \sigma^2 ) 是方差(variance)以下是关于高…

#1024程序员节# 大家一起努力

1024&#xff0c;一年一度的程序员节&#xff0c;俗称“爱码士节”。 1024是2的十次方&#xff0c;二进制计数的基本计量单位之一&#xff0c;1G1024M&#xff0c;而1G与1级谐音&#xff0c;也是一级棒的意思~。程序员(英文Programmer)是从事程序开发、维护的专业人员。 程序员…

QCC Tx 发射器(source)通话(麦克风输入)切换

QCC Tx 发射器&#xff08;source&#xff09;通话&#xff08;麦克风输入&#xff09;切换 1.QCC(QCC3056) Tx 发射器&#xff08;source&#xff09;连接BT 接收设备&#xff08;Sink&#xff09;QCC USB声卡自动识别音乐或者通话&#xff0c;通过蓝牙传输到BT 接收设备&…

【RocketMQ集群】Linux搭建RocketMQ双主双从集群

在当今大数据时代&#xff0c;消息队列系统成为了构建高可用、可扩展和可靠的分布式应用的重要组件之一。而Apache RocketMQ作为一款开源的分布式消息中间件&#xff0c;以其高吞吐量、低延迟和可靠性而备受青睐。为了满足大规模应用的需求&#xff0c;搭建RocketMQ集群是一种常…