首页 > 系统相关 >Linux C编程一站式学习 part2: C语言本质

Linux C编程一站式学习 part2: C语言本质

时间:2024-03-24 10:57:28浏览次数:20  
标签:命令 规则 C语言 编译 part2 Linux maze main stack

Linux C编程一站式学习 (akaedu.github.io)

22. Makefile基础

1.基本规则
欲更新目标,必须首先更新它的所有条件;
所有条件中只要有一个条件被更新了,目标也必须随之被更新。
“更新”:执行一遍规则中的命令列表,命令列表中的每条命令必须以一个Tab开头
对于Makefile中的每个以Tab开头的命令,make会创建一个Shell进程去执行它

#target ... : prerequisites
#	command1
#	command2
# …
main: main.o stack.o maze.o
	gcc main.o stack.o maze.o-o main
# main.o stack.o maze.o发生改变则更新可执行文件main
main.o: main.c main.h stack.h maze.h
	gcc -c main.c
# main.c main.h stack.h maze.h改变则编译main.c生成main.o
stack.o: stack.c stack.h main.h
	gcc -c stack.c
# stack.cstack.hmain.h改变则编译stack.c生成stack.o
maze.o:maze.c maze.hmain.h
	gcc -c maze.c
# maze.c maze.h main.h改变则编译maze.c生成maze.0
# 如果编译之后又对maze.c做了修改,又要把所有源文件编译一遍
# 即使main.c、stack.c和那些头文件都没有修改也要跟着重新编译。
# 一个大型的软件项目往往由上干个源文件组成,全部编译一遍需要几个小时
# 只改一个源文件就要求全部重新编译肯定是不合理的。

目标属于以下情况之一,就称为需要更新:
1.目标没有生成。
2.某个条件需要更新。
3.某个条件的修改时间比目标晚。
Alt
make执行的命令前面加了@字符,则不显示命令本身而只显示它的结果
通常make执行的命令如果出错(该命令的退出状态非0)就立刻终止,不再执行后续命令
但如果命令前面加了-号,即使这条命令出错,make也会继续执行后续命令

  • rm和mkdir都有可能出错,但这种错误是应该忽略的
    Alt
    约定俗成的目标名字有:
    all,执行主要的编译工作,通常用作缺省目标。
    install,执行编译后的安装工作,把可执行文件、配置文件、文档等分别拷到不同的安装目录。
    clean,删除编译生成的二进制文件。
    distclean,不仅删除编译生成的二进制文件,也删除其它生成的文件
    2.隐含规则和模式规则
    一个目标依赖的所有条件不一定非得写在一条规则中,也可以拆开写
    此时只有一条规则允许有命令列表,其它规则应该没有命令列表
    一个目标在Makefile中的所有规则都没有命令列表,make会尝试在内建的隐含规则(Implicit Rule)数据库(可以用make -p命令打印)中查找适用的规则
    例如配置文件和格式转换后的文档,执行make distclean之后应该清除所有这些文件,只留下源文件
# default 
OUTPUT_OPTION = -o $@  
# default 
CC = cc  
# default 
COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c  
%.o: %.c  #模式规则(Pattern Rule)
#  commands to execute (built-in):         
$(COMPILE.c) $(OUTPUT_OPTION) $<

$(CFLAGS)展开是空,CPPFLAGSTARGET_ARCH也是如此。
这样$(COMPILE.c)展开应该是cc␣空␣空␣空␣-c,去掉所有的“空”得到cc␣␣␣␣-c
注意中间留下4个空格
所以%.o: %.c规则的命令$(COMPILE.c)␣$(OUTPUT_OPTION)␣$<
展开之后是cc␣␣␣␣-c␣-o␣$@␣$<
$@的取值为规则中的目标
$<的取值为规则中的第一个条件
翻译后如下!

main.o: main.c
  cc    -c -o main.o main.c

以条件为中心,Makefile还可以这么写(只要把所有的依赖关系都描述清楚了就行)

main: main.o stack.o maze.o
	gcc main.o stack.o maze.o -o main
main.o stack.o maze.o: main.h
main.o maze.o: maze.h
main.o stack.o: stack.h
clean:
	-rm main *.o
.PHONY: clean

多目标的规则,make会拆成几条单目标的规则来处理

target1 target2: prerequisite1 prerequisite2
	command $< -o $@

展开如下

target1: prerequisite1 prerequisite2
	command prerequisite1 -o target1

target2: prerequisite1 prerequisite2
	command prerequisite1 -o target2

标签:命令,规则,C语言,编译,part2,Linux,maze,main,stack
From: https://www.cnblogs.com/asandstar/p/18092139

相关文章

  • C语言UNIX域套接字CS模型
    实验目标:1实现基于流的unix域套接字通信cs模型2实现基于数据报的unix域套接字通信cs模型3可以观察到CS两端的完整启动退出流程,为了实现这一目标仅进行一次通信实验心得:1使用unlink避免地址冲突清理资源2 传统udp在首次sendto时系统临时分配端口,在套接字关闭|程......
  • Linux操作系统的简单终端(Terminal)命令
    ls:列出当前目录下的文件和文件夹。你可以使用ls-l来查看详细信息,或者使用ls-a来显示包括隐藏文件在内的所有文件。cd:用于切换目录。例如,cdDocuments会进入Documents文件夹。你还可以使用cd..来返回上一级目录,或者使用cd~来回到你的主目录。pwd:显示当前所在的目录路径。chm......
  • linux命令详解——uniq,wc,tr
     uniquniq可以对查看内容去重但在我们使用时会发现,uniq的去重逻辑是,当遇到连续多行内容相同时,去除重复行,而对间隔重复内容,无法实现去重功能这里想到可以将sort与uniq结合使用,先对文件内容进行排序,将相同内容行紧邻,然后再使用uniq去重(使用管道符将一个命令的结果作为另一个......
  • 【Linux网络】ip route 命令
    1.iproute命令1.1ip查看已有路由iproutelist#列出默认路由表,和下面这句结果相同iprouteshowtablemain结果(以Ubuntu为例):zx@ubuntu:~/Desktop/codes/muduo/build/release-cpp11/bin$ifconfigens33:flags=4163<UP,BROADCAST,RUNNING,MULTICAST>mt......
  • Linux系统之jq工具的基本使用
    Linux系统之jq工具的基本使用一、jq工具介绍1.jq工具简介2.jq工具的特点二、jq工具的安装1.yum安装jq2.二进制安装jq三、jq命令的使用帮助1.查询jq命令帮助信息2.jq命令的选项解释四、jq命令的基本使用1.显示json文件的所有的key2.显示key对应的值3.查询json......
  • Linux环境下使用Eclipse Paho C 实现(MQTT Client)同步模式发布和订阅Message
    目录概述1同步模式和异步模式1.1同步模式1.2异步模式2下载和安装paho.mqtt.c3同步方式发布和订阅消息功能实现3.1MQTTClient参数配置3.2初始化MQTTClient3.3发布消息功能3.4订阅消息功能3.5解析订阅的信息4编译和测试4.1编译代码4.2运行5验证MQ......
  • c语言学习路线
    学习C语言可以按照以下路线进行:基础知识:了解C语言的基本语法和特性学习C语言的数据类型、控制流和函数熟悉指针和内存管理的概念数组和字符串:学习如何操作数组和字符串掌握数组和字符串的常见操作和算法熟悉C语言中的字符处理函数结构体和指针:理解结构体的概念和用法......
  • Linux进程查看与杀死进程
    Linux进程查看与杀死进程摘要:在Linux操作系统中,我们经常需要查看当前正在运行的进程,有时也需要结束某个不响应或占用资源过多的进程。本文将详细介绍如何在Linux中使用命令行工具查看和杀死进程。一、进程查看ps命令:ps是"processstatus"的缩写,用于显示系统中的当前进程......
  • 快速排序(C语言)
    快速排序(英语:Quicksort),又称分区交换排序,简称「快排」,是一种被广泛运用的排序算法。快速排序的工作原理是通过分治的方式来将一个数组排序。快速排序分为三个过程:将数列划分为两部分(要求保证相对大小关系);递归到两个子序列中分别进行快速排序;不用合并,因为此时数列已经完全有序......
  • 工作中常用到的Linux命令
    系统,用户信息操作相关命令查看主机ip地址ifconfig获取用户信息id修改用户密码passwd查看链接用户who创建新用户账号useradd删除用户账号userdel修改用户账号的属性usermod查看系统发行版本cat/proc/version说明适用于所有版本。示例[root@vps ~]# cat /pro......