makefile和CMakeLists/C++包管理器

make

  • 大家可能会很奇怪,都什么年代了,还学makefile,cmake都有些过时了,为什么还要再学这个呢?

  • 我是这么看待这个问题的,cmake跨平台性还是很有有优势的,有着多年积累的底蕴,借助大模型可以很好的利用这个工具。而cmake的原理就是自动生成makefile,所以还是很值得学习makefile,了解历史的。

  • makefile和CMakeLists

    • 当只是编写一个文件的代码时,直接使用命令运行很方便。但是一但项目复杂起来后,就会难以管理,这个时候使用自动化构建工具就会十分方便,常用的构建工具有make和Cmake。make通过makefile对项目进行管理。Cmake通过配置生成适应各操作系统版本的makefile文件有着很好的跨平台性。

一、makefile

  1. 简单的编译运行命令(g++为例C++,g++会自动连接依赖库,适用于C++)

    g++ <依赖文件> -o <目标文件>

  2. makefile的规则

    <目标文件> : <依赖文件>

    <要执行的命令>

    hello: main.c message.c
    	gcc main.c message.c -o hello
    
  3. makefile特征

    1. makefile的扩展名是.mk,但是创建的时候直接忽略就好

    2. 执行的命令前面必须是tab键

    3. 实际情况应该是先编译后再链接,推荐此种写法

      在这里插入图片描述

    4. 伪目标:不生成目标文件的目标,只是一个标签,最常用的就是clean和all,clean常用来产生的临时文件

      在这里插入图片描述

      • 伪目标注意:

        1. 不要和文件名重复,因为伪目标运行的时候是make <伪目标>这样的格式,而也有这种类型的命令make <file>来指定目标的生成,所以如果伪目标和文件名重复,则会冲突

        2. 解决方案,在开头加上.PHONY: <伪目标>,来显示告诉编译器,这就是个伪目标

          在这里插入图片描述

        3. 当需要同时执行多个可执行文件的生成的时候就可以使用all伪目标,格式伪all: <目标文件> <目标文件>,当然把all放在除.PHONY: <伪目标>之后,make直接执行默认也是为目标所指定的所有目标文件

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

      1. 同一种规则和依赖文件的简化写法

        在这里插入图片描述

      2. 禁止执行的命令行输出打印在终端上

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

        在对应命令加上@就好

      3. 使用变量,常常讲一些命令行参数以及源文件、目标文件、编译文件使用变量定义
        在这里插入图片描述

        1. 特殊符号,常说$<其它特殊符号组成>

          $@代表目标文件

          $<代表第一个依赖文件

          $^代表所有依赖文件

          在这里插入图片描述

        2. 通配符:所有的cpp文件和o文件

          在这里插入图片描述

        3. 更多的分支循环

  4. make

    1. make是按照时间戳来判断是否更新目标文件的,若时间戳不变则无法改变,下图为windows系统,与mac和linux有些许差异

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

    2. 如何运行伪目标

      make <伪目标>在这里插入图片描述

    3. 参数

      1. -f参数指定makefile的文件,可以修改makefile的名称,使用的时候加上-f指向修改好的文件就好

      2. -n参数打印出要执行的命令,但不会执行,常用来用来调试

      3. -C参数调用子模块的makefile

        在这里插入图片描述

二、cmake中的CMakeLists

  1. 基本写法

    cmake_mininum_required(VERSION 3.10)//最小版本指定
    project(HelloWorld)//项目名字
    set(Source main.c)//定义变量
    add_executable(hello ${Source})
    //`<目标文件> : <依赖文件>`
    //	`<要执行的命令>`
    
  2. 优势:

    1. 跨平台性、跨编译器
  3. 其它功能:指定编译选项、链接库、生成静态库、动态库等等

  • 大家应该会很奇怪,前面都说cmake好了,要学习,为什么就讲了这么点内容,我觉得学习这些基础的框架就够了,其它的依靠大模型的帮助会更有性价比。这里可能大家觉得我有些双标,我觉得工具的魅力是它的底蕴,是需要了解它,但是真正用到实际的时候,还是好的漂亮的代码最棒。大模型的代码比大部分写的代码都要合理,因为其训练数据种包含着拥有无数高质量代码的github。

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

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

相关文章

英伟达:AI时代的领跑者,引领智能计算的未来@附149页PDF文件下载

在人工智能的浪潮中&#xff0c;英伟达&#xff08;NVIDIA&#xff09;以其卓越的GPU技术&#xff0c;成为了这个时代的领跑者。从游戏显卡的霸主到AI计算的领导者&#xff0c;英伟达的转型之路充满了创新与突破。今天&#xff0c;我们将深入探讨2024年英伟达如何通过其战略布局…

Apache CVE-2021-41773 漏洞攻略

漏洞简介 该漏洞是由于Apache HTTP Server 2.4.49版本存在⽬录穿越漏洞,在路径穿越⽬录 <Directory/>Require all granted</Directory>允许被访问的的情况下&#xff08;默认开启&#xff09;&#xff0c;攻击者可利⽤该路径穿越漏洞读取到Web⽬录之外的其他⽂件在…

DPDK 简易应用开发之路 2:UDP数据包发送及实现

本机环境为 Ubuntu20.04 &#xff0c;dpdk-stable-20.11.10 发送数据包的通用步骤 初始化DPDK环境&#xff1a; 调用 rte_eal_init() 来初始化DPDK的EAL&#xff08;环境抽象层&#xff09;&#xff0c;这是所有DPDK应用程序的第一步&#xff0c;用于初始化硬件、内存和逻辑核…

[Linux]:线程(一)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Linux学习 贝蒂的主页&#xff1a;Betty’s blog 1. 初识线程 1.1 线程的概念 在操作系统中&#xff0c;进程与线程一直是我们…

简单了解Redis(初识阶段)

1.认识Redis 对于Redis有一个很重要的点就是&#xff0c;它存储数据是在内存中存储的。 但是对于单机程序&#xff0c;直接通过变量存储数据的方式是更优的&#xff0c;在分布式系统下 Redis才能发挥威力 因为进程是有隔离性的&#xff0c;Redis可以基于网络&#xff0c;把进…

CentOS 7 YUM源不可用

CentOS 7 操作系统在2024年6月30日后将停止官方维护&#xff0c;并且官方提供的YUM源将不再可用。 修改&#xff1a;nano /etc/yum.repos.d/CentOS-Base.repo # CentOS-Base.repo [base] nameCentOS-$releasever - Base baseurlhttp://mirrors.aliyun.com/centos/$rel…

前端——flex布局

flex布局——弹性布局 传统布局: 浮动 定位 行内块等 1. flex布局 方法简单 不需要计算 能自动分配父级里面的子元素排版 对齐方式等等 >flex布局 可以适应不同屏幕布局 2. flex布局使用 - 给父级盒子 display: flex 开启弹性盒模型 - 子元素就会默…

html中为div添加展开与收起功能2(div隐藏与显示)

效果图&#xff1a; 1、单个隐藏div项 html布局 <div class"question-detail active"><div class"item-handle"><span class"btn-detail">作答详情 <i class"layui-icon layui-icon-down layui-font-12"><…

数据分析师之Excel学习

前言 excel作为职场人来说&#xff0c;已经是人人必备的技能了&#xff0c;所以还不知道这个的小伙伴&#xff0c;一定要抓紧时间学习&#xff0c;紧跟时代的步伐。 Excel 几个重要的版本 97-2003版本是国内最早流行的版本 .xlsx后缀的表格文件&#xff0c;基本是07版本及…

【数据结构】Java的HashMap 和 HashSet 大全笔记,写算法用到的时候翻一下,百度都省了!(实践篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

1.随机事件与概率

第一章 随机时间与概率 1. 随机事件及其运算 1.1 随机现象 ​ 确定性现象&#xff1a;只有一个结果的现象 ​ 确定性现象&#xff1a;结果不止一个&#xff0c;且哪一个结果出现&#xff0c;人们事先并不知道 1.2 样本空间 ​ 样本空间&#xff1a;随机现象的一切可能基本…

什么是智慧党建?可视化大屏如何推动高质量党建?

在数字化时代&#xff0c;党建工作迎来了新的发展机遇。智慧党建&#xff0c;作为新时代党建工作的创新模式&#xff0c;正逐渐成为推动党的建设向高质量发展的重要力量。它不仅改变了传统的党建工作方式&#xff0c;还通过现代信息技术的应用&#xff0c;提升了党建工作的效率…

【CSS】鼠标 、轮廓线 、 滤镜 、 堆叠层级

cursor 鼠标outline 轮廓线filter 滤镜z-index 堆叠层级 cursor 鼠标 值说明值说明crosshair十字准线s-resize向下改变大小pointer \ hand手形e-resize向右改变大小wait表或沙漏w-resize向左改变大小help问号或气球ne-resize向上右改变大小no-drop无法释放nw-resize向上左改变…

AI绘画Stable Diffusion 自制素材工具: layerdiffusion插件—你的透明背景图片生成工具

大家好&#xff0c;我是灵魂画师向阳 今天给大家分享一款AI绘画的神级插件—LayerDiffusion。 Layerdiffusion是一个用于stable-diffusion-webui 的透明背景生成&#xff08;不是生成图再工具扣图&#xff0c;是直接生成透明背景透明图像&#xff09;插件扩展&#xff0c;它可…

Java笔试面试题AI答之设计模式(2)

文章目录 6. 什么是单例模式&#xff0c;以及他解决的问题&#xff0c;应用的环境 &#xff1f;解决的问题应用的环境实现方式 7. 什么是工厂模式&#xff0c;以及他解决的问题&#xff0c;应用的环境 &#xff1f;工厂模式简述工厂模式解决的问题工厂模式的应用环境工厂模式的…

音乐服务器测试报告

项目背景 该音乐服务器系统使用的是前后端分离的方式来实现,将相关数据存储到数据库中, 且将其部署到云服务器上. 前端主要构成部分有: 登录页面, 列表页面, 喜欢页面, 添加歌曲4个页面组成. 通过结合后端实现了主要的功能: 登录, 播放音乐, 添加音乐, 收藏音乐, 删除音乐, 删…

vscode 配置django

创建运行环境 使用pip安装Django&#xff1a;pip install django。 创建一个新的Django项目&#xff1a;django-admin startproject myproject。 打开VSCode&#xff0c;并在项目文件夹中打开终端。 在VSCode中安装Python扩展&#xff08;如果尚未安装&#xff09;。 在项…

MySQL InnoDB MVCC读写逻辑分析与调测

目标 1、构建MVCC读写场景 2、gdb调试MVCC过程&#xff0c;输出流程图&#xff08;函数级别调用过程&#xff09; 前提 准备1 打开服务端 查询mysqld进程号 线程树 打开客户端&#xff0c;想创建几个事务号就打开几个客户端 准备2 数据库mvcc&#xff0c;两个表test和stu…

Spring Boot框架在甘肃非遗文化网站设计中的运用

3 系统分析 当用户确定开发一款程序时&#xff0c;是需要遵循下面的顺序进行工作&#xff0c;概括为&#xff1a;系统分析–>系统设计–>系统开发–>系统测试&#xff0c;无论这个过程是否有变更或者迭代&#xff0c;都是按照这样的顺序开展工作的。系统分析就是分析系…

数据库——sql语言学习 查找语句

一、什么是sql SQL是结构化查询语言&#xff08;Structured Query Language&#xff09;的缩写&#xff0c;它是一种专门为数据库设计的操作命令集&#xff0c;用于管理关系数据库管理系统&#xff08;RDBMS&#xff09;。 二、查找相关语句 ‌‌首先&#xff0c;我们已经设…