CMake:相关概念与使用入门(一)

1、Cmake概述
  • Cmake是一个项目构建工具,并且是跨平台的。

  • 关于项目构建我们所熟知的有Makefile,然后通过make命令进行项目的构建,并且大多数是IDE都继承了make,比如:VS的nmake,Linux下的GNU make、Qt的qmake等。

  • 如果自己手动写makefile,会发现makefile通常依赖当前的编译平台,并且makefile的工作量比较大,解决依赖关系也容易出错。

  • 而Cmake恰好能解决上述问题,其允许开发者指定整个过程的编译流程,在根据编译平台,自动生成本地化的Makefile和工程文件,最后用户只需要make编译即可,Cmake是一款用来生成Makefile的构建工具

  • Cmake给我的理解更像是Java语言用于管理项目的Maven和Gradle,但是没有Maven它们有那么强大的功能
    在这里插入图片描述

2、Cmake简单使用
# 这是一个CMakeLists.txt文件

#[[ 这是一个CMakeLists.txt文件
这是一个CMakeLists.txt文件
这是一个CMakeLists.txt文件
]]

# 指定当前项目所需的最低cmake版本
cmake_minimum_required(VERSION 3.10.2)

# 定义工程名字
#project(test_project
#        [VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
#        [DESCRIPTION <project-description-string>]
#        [HOMEPAGE_URL <url-string>]
#        [LANGUAGES <language-name>...])
project(test_project)

# 添加生成可执行文件的名称和所需要的依赖(依赖以 或者;分隔开)
#add_executable(main main.cpp)
#add_executable(main main.cpp;sub.cpp;add.cpp;mul.cpp;dived.cpp)
add_executable(main main.cpp sub.cpp add.cpp mul.cpp dived.cpp)
  • Cmake支持大写、小写、混合大小写的命令,如果在编写CMakeLists.txt文件时使用的工具对应的命令提示,那么大小写随缘即可。

  • 注释行:#后面进行写注释

  • 注释块:#后面不能有空格必须紧跟着[[

  • cmake_minimum_required:指定使用的cmake最低版本

  • project:定义工程名称,并可以指定工程的版本、工程描述、web主页地址、支持的语言(默认情况下支持所有语言),如果不需要这些都是可以忽略的,只需要指定出工程名字即可。

  • add_executable:定义工厂会生成一个可执行程序

3、Cmake简单使用
# tree命令
.
├── add.cpp
├── build
├── CMakeLists.txt
├── dived.cpp
├── head.h
├── main.cpp
├── mul.cpp
└── sub.cpp
  • head.h头文件中定义了add、sub、mul、dived四则运算

  • 分别在对应的.cpp文件中进行实现,然后main.cpp是程序的入口

  • CMakeLists.txt就是我们需要编写的文件,编写完毕之后进入build目录进行构建

  • 由于cmake命令会生成大量的一些编译产生的文件,为了防止污染工程通常都会在build文件夹下进行构建

  • 执行流程

    # 进入build文件夹
    cd build
    
    # cmake需要指定CMakeLists.txt文件所在的目录,生成Makefile
    cmake ../	
    
    # 执行make进行编译,生成可执行程序
    make
    
    # 执行可执行程序
    ./main
    
    /* 输出
    a + b = 12
    a - b = 8
    a * b = 20
    a / b = 5
    */
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV与AI深度学习 | 如何使用YOLOv9分割图像中的对象

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;如何使用YOLOv9分割图像中的对象 1 介绍 在我们之前的文章中&#xff0c;我们使用 YOLOv8 探索了令人兴奋的对象分割世界。分割使计算机视觉比…

Linux进程详解:进程优先级,调度算法,进程特性

文章目录 进程优先级Linux下的调度算法进程特性 进程优先级 进程要访问某种软硬件资源&#xff0c;此时进程需要通过一定的方式&#xff08;排队&#xff09;&#xff0c;来确认享受某种资源的先后顺序。 优先级是确认先后问题&#xff0c;权限是确认能不能的问题。 资源有限…

5个常见的前端手写功能:浅拷贝与深拷贝、函数柯里化、数组扁平化、数组去重、手写类型判断函数

浅拷贝与深拷贝 浅拷贝 浅拷贝是创建一个新对象&#xff0c;这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型&#xff0c;拷贝的就是基本类型的值&#xff0c;如果属性是引用类型&#xff0c;拷贝的就是内存地址&#xff0c;所以如果其中一个对象改变了这个地…

数据库安全如何保障?YashanDB有妙招(上篇)

数据库作为信息系统的核心&#xff0c;不仅承载着海量的关键数据&#xff0c;还负责向各类用户提供高效、可靠的信息服务&#xff0c;数据库的安全性显得尤为关键&#xff0c;已成为信息安全体系的重中之重。 什么是数据库安全&#xff1f; 数据库安全是数据安全的一个子集&…

AI-数学-高中-45函数单调性与导数

原作者视频&#xff1a;【导数】【一数辞典】5函数单调性与导数&#xff08;重要&#xff09;_哔哩哔哩_bilibili 导数最重要作用&#xff1a;判断函数单调性。 示例&#xff1a;

基于SpringBoot和Leaflet的地震台网信息预警可视化

目录 前言 一、后台管理设计与实现 1、Model层 2、业务层 3、控制层 二、前端预警可视化设计与实现 1、网页结构 2、数据绑定 三、效果展示 总结 前言 在之前的几篇博客中&#xff0c;我们讲解了如何在Leaflet中进行预警信息提示效果&#xff0c;以及基于XxlCrawler进…

智能写作工具,一键改写文章不费力

改写是一种用来创作原创文章的方式&#xff0c;也是用来提升文章质量的方法。无论我们在创作中通过改写来提升文章的质量&#xff0c;还是用改写帮助我们达到原创文章的生成&#xff0c;文章改写都可以实现我们这些目的&#xff0c;然而&#xff0c;想要高效率轻松改写文章我们…

三分钟设计自己的工厂!基于昇腾AI处理器昇思MindSpore打造的智能化工大模型为化工研发效率带来10+倍提升

前言&#xff1a;华为与大连化物所深度合作&#xff0c;联合推出智能化工大模型&#xff0c;AI赋能化工领域&#xff0c;拥抱科学创新&#xff0c;提供了数据驱动化工研发的新范式。 2024年3月22日&#xff0c;在北京国家会议中心召开的昇思人工智能框架峰会上发布了由华为AI4…

VForm3的文件上传方式

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

智能条件单无需盯盘!

一般我们说到量化交易都觉得很困难&#xff0c;写策略难&#xff0c;看python难&#xff0c;不会使用程序难&#xff0c;电脑交易不方便难&#xff0c;今天我们来看看手机电脑都可以使用的量化基础条件单的操作。 迈入量化第一步&#xff0c;条件单的使用&#xff01; 今天小编…

企业微信hook接口协议,标签变动回调

个人标签新增回调 {"labellist": [{"op": 3, "bDeleted": 0, //0代表新增"create_time": 1678114162, "label_groupid": 14073749131792038, "label_type": 2, "source_appid": 0, "business_typ…

Python 装饰器

Python 装饰器 1. 简单的装饰器 下面是一个简单的装饰器示例&#xff0c;它记录被装饰函数的调用信息&#xff1a; def my_decorator(func):""" 中层函数&#xff1a;接收被装饰的函数 """def wrapper():""" 内层函数&#xf…

嵌入式4-25

整理思维导图在课上练习的基础上&#xff0c;完成拷贝赋值函数完成下列类 #include <iostream> using namespace std;class person {string name;int age;char sex; public:int *p;person(){cout<<"person无参构造"<<endl;};person(const string n…

专业护眼灯什么牌子好?2024年专业护眼灯品牌排行分享

专业护眼灯什么牌子好&#xff1f;各位家长可能已经注意到一个令人关切的现象&#xff1a;戴眼镜的孩子人数在不断上升&#xff0c;许多孩子正在接受眼部治疗。眼睛健康的问题变得越来越普遍&#xff0c;这无疑令人担忧。在当今数字化时代&#xff0c;孩子们每日需长时间阅读和…

对腾讯文档AI助手技术架构的简单分析

腾讯文档全面接入了AI&#xff0c;今天腾讯技术大佬tensorchen作者发表了一篇文章《腾讯文档AI助手技术实践》&#xff0c; 里面讲解了从技术应用架构以及AI大模型赋能角度&#xff0c;介绍腾讯文档AI智能助手的探索和实践之路。作为一款集多功能为一体的AI产品&#xff0c;腾…

Web前端开发之HTML_3

标签之表格Form表单块元素与行内元素&#xff08;内联元素&#xff09;HTML5新增标签 1. 标签之表格 <table></table> 1.1 表格&#xff08;快速生成&#xff1a;table>tr*2>td*3{单元格}&#xff09; 表格由行、列、单元格组成。单元格有同行等高、同列等…

(八)Servlet教程——创建Web项目以及Servlet的实现

1. 打开Idea编辑器 2. 点击界面上的“新建项目”按钮 3. 设置好项目名称和位置 应用服务器选择之前设置好的Tomcat服务器 构建系统默认选择Maven 4. 点击“下一步”按钮 5. 点击“完成”按钮&#xff0c;Idea就创建好了项目&#xff0c;创建完成后的目录结构如下图所示 6. 此…

2024.4.25

#include <iostream> #include <iomanip> using namespace std; class Person{const string name;int age;char sex; public:Person(const string name):name(name){cout << "第一个Person构造函数" << endl;}Person():name("zhangsan&…

js网络请求---fetch和XMLHttpRequest的用法

fetch 语法规则 let promise fetch(url, [options]) //url —— 字符串&#xff1a;要访问的 URL。 //options —— 对象&#xff1a;可选参数&#xff1a;method&#xff0c;header 等。 fetch函数返回一个promise&#xff0c;若存在网络问题&#xff0c;或网址不存在&…

Java通过邮件发送验证码和通过手机号发送验证码

前提&#xff1a;我将验证码存入了map集合&#xff0c;进行验证。 private static HashMap<String, Integer> emailMap new HashMap<>();一、通过邮箱发送验证码&#xff1a; 1、准备条件&#xff1a;引入hutool依赖&#xff0c; <!--hutool--><depend…