Linux项目自动化构建工具---make/Makefile

2023-05-16

make/Makefile

  • 1. 背景
    • 1.1 如何编写Makefile
      • 1.1.1 依赖关系
      • 1.1.2 依赖方法
      • 1.1.3 项目清理
  • 2. Linux第一个小程序---进度条
    • 2.1 回车和换行概念
    • 2.2 行缓冲区概念
    • 2.3 完整的进度条代码和解析

1. 背景

  1. 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  2. 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操
  3. makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  4. make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual
    C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
  5. make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

在VS当中,项目管理(多文件管理),VS帮我们自动管理

在Linux当中,维护项目文件关系的工作,需要让make/Makefile来完成

1.1 如何编写Makefile

这里打算编写一个计算器中加的功能键作为简单的代码剖析解释:
①应该将相应的文件创建出来
在这里插入图片描述
②编写Makefile文件
在这里插入图片描述
在这里插入图片描述
上图是最开始也是最容易理解的版本。
在这里插入图片描述
第二个图和第一个图的不同就在于gcc -c main.c 这个地方的后面,其实这里编译的时候后面可以省略,因为他会自动的生成同名的.o文件
在这里插入图片描述
在这里插入图片描述
在这个写法下,那么就不会再出现文件的原始名字,而是全部使用变量替换掉了。

注意:命令前必须是一个“TAB键”,否则编译错误为: missing separator. Stop.

这里就需要加入一些Makefile编写的一些知识
自动变量:
在这里插入图片描述

1.1.1 依赖关系

main:main.o cal.o 就是依赖关系
如果想生成可执行的main文件,那么就需要相对应的“.o
事实上这里还是有过程的省略:

main:main.o 
main.o:main.s
main.s:main.i
main.i:main.c

这个才是完整的依赖关系表示

1.1.2 依赖方法

gcc -o main main.o cal.o 就是 main:main.o cal.o 的依赖方法

对于依赖方法也可以认为是依赖关系的实现,如果在依赖关系不成立的情况下,那么依赖方法是不执行的。

1.1.3 项目清理

  1. 工程是需要被清理的。
  2. 像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make
    clean”,以此来清除所有的目标文件,以便重编译。
  3. 但是一般我们这种clean的目标文件,我们将它设置为伪目标,用 .PHONY 修饰,伪目标的特性是,总是被执行的。(但是你的make只要生成了可执行程序就不能再生成了)

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

2. Linux第一个小程序—进度条

2.1 回车和换行概念

’\r’是回车,’\n’是换行,前者使光标到行首,后者使光标下移一格。通常用的Enter是两个加起来。

2.2 行缓冲区概念

什么现象???

//①
#include <stdio.h>
 
int main() 
{    
	printf("hello Makefile!\n");    
	sleep(3);    
	return 0;
}
//②
#include <stdio.h>
 
int main() 
{    
	printf("hello Makefile!");    
	sleep(3);    
	return 0; 
}
//③
#include <stdio.h>
 
int main() 
{    
	printf("hello Makefile!");    
	fflush(stdout);    
	sleep(3);    
	return 0; 
}

刷新策略

①程序来说,会直接显示hello Makefile!这个称之为行刷新,因为有’\n’的标志
②程序来说,会把程序执行完,也就是先等3秒然后输出hello Makefile! 这个叫做程序结束刷新
强制刷新:C程序在默认的情况下,会打开三个文件(3个设备:键盘、显示器、显示器),FILE* stdin stdout stderr ,标准输入 ,标准输出,标准错误,你的程序都是存放在磁盘上的,首先进来以后都是先放在缓冲区中,但是并没有输出,只有缓冲区刷新了才能看到所要输出的字符串内容。
④当你没有行刷新标志和结束刷新的时候就要使用强制刷新来显示缓冲区的内容

2.3 完整的进度条代码和解析

Makefile编写
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

难点

1.define NUM 101 这里是因为你需要在这里面放100个‘#’并且每次以字符串的形式输出,需要‘\0’的标志
2.反斜杠表示后面的字母不再有特殊的含义而是按照字面的意思匹配词中特定的字符
3.在C语言中[%-100s] 这里的**“-”表示左对齐,如果不加那就默认右对齐**
4.如果[%d%%]如果这里想输出一个%X那么需要加两次%
5.因为在设置旋转光标的时候只有"| / - "所以要lable[i%4]那么你的i只能取到数组的下标为0~3
6.fflush因为这里没有行刷新和程序结束刷新所以需要强制刷新。
7.对于sleep来说里面的单位是s但是,在这里就会显的太慢了,所以这里需要一个单位更小的,需要使用usleep,但是usleep的单位是微妙所以这里我们是想它所间隔的时间为0.01s。
8.最后如果不换行直接在Linux下运行的话,就会出现覆盖的现象,所以换行输出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux项目自动化构建工具---make/Makefile 的相关文章

  • 在 Linux 上的 Python 中使用受密码保护的 Excel 工作表

    问题很简单 我每周都会收到一堆受密码保护的 Excel 文件 我必须解析它们并使用 Python 将某些部分写入新文件 我得到了文件的密码 当在 Windows 上完成此操作时 处理起来很简单 我只需导入 win32com 并使用 clie
  • .NET Core 中的跨平台文件名处理

    如何处理文件名System IO以跨平台方式运行类以使其在 Windows 和 Linux 上运行 例如 我编写的代码在 Windows 上完美运行 但它不会在 Ubuntu Linux 上创建文件 var tempFilename Dat
  • 在 Linux 中禁用历史记录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 要在 Linux 环境中禁用历史记录 我执行了以下命令 export HISTFILESIZE 0 export HISTSIZE 0 u
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然
  • 在Linux上编译C# + WPF以便在Windows上运行

    我有一个 C 应用程序 其中某些部分是使用 WPF 编写的 Mono 不支持 可以在 Linux 上编译这个应用程序吗 最终 该应用程序将在 Windows 上运行 但它是更大框架的一部分 并且我们的整个构建过程在 Linux 上运行 因此
  • 为什么我收到的数据包数据大小大于mss?

    我在两台 PC 上使用 ifconfig ethX mtu 300 修改了 MTU 并使用 netperf 测试网络 我用 WireShark 嗅探了 SYN 数据包中的 MSS 260 但我得到了一些大于 260 的数据包 为什么 嗅探器
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • 从 PL/SQL 调用 shell 脚本,但 shell 以 grid 用户而非 oracle 身份执行

    我正在尝试使用 Runtime getRuntime exec 从 Oracle 数据库内部执行 shell 脚本 在 Red Hat 5 5 上运行的 Oracle 11 2 0 4 EE CREATE OR REPLACE proced
  • awk 子串单个字符

    这是columns txt aaa bbb 3 ccc ddd 2 eee fff 1 3 3 g 3 hhh i jjj 3 kkk ll 3 mm nn oo 3 我可以找到第二列以 b 开头的行 awk if substr 2 1 1
  • 如何制作一个makefile只用于编译一些java文件?

    我有三个java文件 名为A java B java C java A将创建对象B B将创建对象C 但我以前从未构建过makefile 有谁可以帮我构建一个 makefile 来编译这三个 java 文件吗 我应该使用什么工具来制作 mak
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • 如何使用 bash 锁定文件

    我有一个任务从远程服务器同步目录 rsync av email protected cdn cgi l email protection srv data srv data 为了使其定期运行并避免脚本 reEnter 问题 我使用 rsyn
  • 应用程序无缘无故地被杀死。怀疑 BSS 高。如何调试呢?

    我已经在CentOs6 6中成功运行我的应用程序 最近 硬件 主板和内存 更新了 我的应用程序现在毫无理由地被杀死 root localhost PktBlaster PktBlaster Killed 文件和 ldd 输出 root lo
  • 如何禁用 GNOME 桌面屏幕锁定? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何阻止 GNOME 桌面在几分钟空闲时间后锁定屏幕 我已经尝试过官方手册了在红帽 https access redhat com doc
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 域套接字“sendto”遇到“errno 111,连接被拒绝”

    我正在使用域套接字从另一个进程获取值 就像 A 从 B 获取值一样 它可以运行几个月 但最近 A 向 B 发送消息时偶尔会失败 出现 errno 111 连接被拒绝 我检查了B域套接字绑定文件 它是存在的 我也在另一台机器上做了一些测试 效
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • 所有平台上的java

    如果您想用 java 为 Windows Mac 和 Linux 编写桌面应用程序 那么所有这些代码都相同吗 您只需更改 GUI 即可使 Windows 应用程序更像 Windows 等等 如果不深入细节 它是如何工作的 Java 的卖点之
  • 具有两个同名目标的 Makefile

    我有一个包含包含语句的 makefile 我无法控制包含的 makefile 的内容 不过 我希望能够在 某些 不是全部 目标之前添加一些预处理步骤 考虑以下示例 install echo install target include ot

随机推荐

  • ROS项目解析JSON的问题

    fatal error json json h No such file or directory sudo apt get install libjsoncpp dev sudo ln s usr include jsoncpp json
  • 找自动驾驶工作该学习哪些必要知识?(ChatGPT-回答版)

    Q xff1a 找自动驾驶工作该学习哪些必要知识 xff1f A xff1a 机器学习 监督学习 xff1a 包括分类 回归等 xff0c 学习如何使用监督学习算法对数据进行预测和分类 无监督学习 xff1a 包括聚类 降维等 xff0c
  • 51单片机定时器初值计算

    菜鸟关于51类单片机的定时器初值计算问题的计算 首先先来介绍单片机的几个周期 xff1a 1 时钟周期 xff0c 也称为振荡周期 xff1a 定义为时钟脉冲的倒数 xff0c 在单片机中也就等于晶振的倒数 51单片机中把一个时钟周期定义为
  • 了解“回收站”

    一 不管是Windows还是Linux桌面 xff0c 删除文件操作都是相同的 1 删除操作 xff0c 可以选中文件 xff0c 按键盘上的 delete 键删除 xff0c 可以是鼠标右键 xff0c 然后在快捷菜单中单击 删除 按钮删
  • 信创环境下三个开源数据库:SQLite、MariaDB(MySQL)和postgreSQL(瀚高数据库免费版)基本操作

    在信创环境下 xff0c 常用的免费数据库主要是 xff1a SQLite MariaDB xff08 MySQL xff09 和postgreSQL xff08 瀚高数据库免费版 xff09 xff0c 可以在一些产品中内嵌使用 SQLi
  • 内网自建yum源和apt源(含各信创系统)

    现在Linux下面软件基本是通过yum apt等从软件仓库在线安装 xff0c 大的Linux发行版都有自己的软件仓库 如CentOS RedHat使用yum方式仓库 xff0c ubuntu使用apt方式仓库 很多政企单位内部网络是和互联
  • 国产信创Linux桌面系统比较:软件包格式及软件管理、桌面环境及桌面应用

    信创产业中 xff0c 操作系统开始整合 xff0c 基本上集中在银河麒麟V10和UOS2 xff0c 很多朋友问到各种国产信创Linux系统的区别和比较 因此结合前期写的几篇文章 xff0c 对这个问题再进行了整理 以龙芯CPU为例 xf
  • Date类型转换为字符串类型

    Date date 61 new Date SimpleDateFormat fmt 61 new SimpleDateFormat 34 yyyy MM dd HH mm ss 34 String dateStr 61 fmt forma
  • 《机关单位办公自动化应用指南 (基于国产信息技术应用创新终端)》与银河麒麟V10

    机关单位办公自动化应用指南 基于国产信息技术应用创新终端 一书适合各国产Linux桌面系统 xff0c 但是举例说明基本是基于中标麒麟V7 银河麒麟V10和中标麒麟V7都采用MATE桌面 xff0c 对于普通用户桌面操作而言差别不大 xff
  • NFS故障:Stale NFS file handle的解决一例

    故障描述 xff1a 一台备份一体机设备作为NFS服务端 xff0c export了目录 infokit exportnfs xff0c 从其他设备上挂载这个NFS 目录 xff0c 在NFS服务端和客户端及其上showmount e 都一
  • CentOS7部署nextcloud最新版本

    Nextcloud 是一个免费专业的私有云存储网盘 开源 项目 xff0c Nextcloud开发人员来自owncloud Nextcloud 跨平台支持 Windows Mac Android iOS Linux 等平台 xff0c 提供
  • SQL表间操作

    MySQL表间操作 近期需要对数据进行整理 xff0c 涉及多个安全产品的数据库 xff0c 基本都是MySQL的 xff0c 经常需要进行表的合并 整理操作 MySQL常见的求交集 并集和差集 1 select a b from tabl
  • ipref网络性能评估工具

    ipref网络性能评估工具 基本介绍 网络的主要性能参数包括带宽 xff0c 时延 xff0c 抖动和丢包率 xff0c 用一个名词就是QOS xff08 服务质量 xff09 Iperf xff08 可测丢包率 xff09 可以用来测量网
  • 抓取特定DNS查询包:tcpdump vs wireshark

    近期 xff0c 在办公网络中出现网络不稳定问题 xff0c 经过分析发现是网内大量的终端安装的安全软件 xff0c 每秒钟都定期进行地址探测 xff0c 其中需要探测taobao com之类的域名地址 xff0c 造成大量的DNS查询 x
  • ceph——数据修复/均衡速度测试

    以副本环境的数据均衡为例 xff0c 以下需要注意 xff1a 1 写入数据时 xff0c 用脚本监控写入数据量 xff08 ceph df xff09 到达预定值 xff0c 开始 停止cosbench cosbench支持命令行 进入c
  • iOS 卡顿、掉帧原因+优化

    卡顿 掉帧原因 VSync垂直信号 xff0c 一般说页面流畅是60fps xff0c 也就是每一秒钟会有60帧画面更新 xff0c 相当于16 7ms就要产生一帧画面 xff0c 那么在这16 7ms之内需要由CPU和GPU共同协同完成产
  • archlinux 安装virtualbox

    一 安装前准备 首先安装 linux headers sudo pacman S linux headers 其次确认linux内核的版本 uname r 如果和header的版本不一致 xff0c 需要更新内核 否则的话会在安装virtu
  • debian 切换默认桌面命令

    update alternatives config x session manager 选择gnome session
  • 解决windows系统80端口被占用问题_

    测试这个命令会把打印机共享等依赖http服务的程序停止 xff0c 导致共享无法使用 xff0c 所以还得寻找别的办法 xff0c 后来终于搜索到一条命令 netsh http show servicestate 1 这条命令可以查看到底是
  • Linux项目自动化构建工具---make/Makefile

    make Makefile 1 背景1 1 如何编写Makefile1 1 1 依赖关系1 1 2 依赖方法1 1 3 项目清理 2 Linux第一个小程序 进度条2 1 回车和换行概念2 2 行缓冲区概念2 3 完整的进度条代码和解析 1