makefile学习mk4 Linux系统编程

你提供的 Makefile 定义了一个基本的 C 项目的构建过程。让我逐行解析这个 Makefile 的每个部分:

  1. 变量定义

CC = gcc

CFLAGS = -I.

OBJS = t.o mysum.o

AS = as

DEPS = type.h

复制代码
•	CC = gcc:指定 C 编译器为 gcc。
•	CFLAGS = -I.:指定编译器的选项,这里使用 -I. 表示包含当前目录(.)下的头文件。
•	OBJS = t.o mysum.o:指定生成的目标文件(对象文件),t.o 和 mysum.o。
•	AS = as:指定汇编器为 as,但此处没有明确调用,所以可能是冗余的,除非你有汇编源文件。
•	DEPS = type.h:指定头文件依赖,表示 t.c 和 mysum.c 需要 type.h。

  1. 汇编到目标文件的规则

.s.o:

(AS) -o < -o $@

这条规则是用来将汇编源文件(.s 文件)编译成目标文件(.o 文件)。然而,这个规则有些问题,as 命令不需要 -o \< -o @,正确的用法应该是:

.s.o:

(AS) -o @ $<

复制代码
•	$< 是第一个依赖文件,表示 .s 文件。
•	$@ 是目标文件,表示 .o 文件。

  1. C 源文件到目标文件的规则

.c.o:

(CC) -c < -o $@

这条规则表示将 C 源文件(.c 文件)编译成目标文件(.o 文件)。 < 是源文件, < 是源文件, <是源文件,@ 是目标文件。这里 -c 表示只进行编译而不链接。

  1. 模式规则

%.o: %.c $(DEPS)

(CC) -c -o @ $<

这是一个模式规则(pattern rule),表示将任意的 .c 文件编译成对应的 .o 文件,并且依赖于 $(DEPS)(即 type.h)。这与上面的规则是重复的,且由于模式规则的存在,.c.o 的规则可以删除。

  1. 目标文件生成可执行文件的规则

myt: $(OBJS)

(CC) (CFLAGS) -o @ ^

这条规则表示如何从目标文件生成最终的可执行文件 myt。 @ 是目标文件(即 m y t ), @ 是目标文件(即 myt), @是目标文件(即myt),^ 是所有的依赖文件(即 ( O B J S ) ,即 t . o m y s u m . o )。 (OBJS),即 t.o mysum.o)。 (OBJS),即t.omysum.o)。(CFLAGS) 是包含路径选项。

  1. 总结
    • 该 Makefile 是为了从 C 代码(t.c 和 mysum.c)编译并链接生成一个名为 myt 的可执行文件。
    • ( C C ) 是用 g c c 编译 C 文件, (CC) 是用 gcc 编译 C 文件, (CC)是用gcc编译C文件,(AS) 是用 as 编译汇编文件,但这个 as 规则在你的 Makefile 中似乎冗余,除非你需要处理汇编文件。
    • 最终的可执行文件是通过将 .o 文件链接在一起得到的。

改进建议

  1. 删除冗余规则:

如果你不需要处理汇编文件,可以删除 .s.o 和 AS 相关的行。

  1. 优化规则:

使用模式规则来简化 .c 文件到 .o 文件的编译过程,避免重复规则。例如,可以去掉 .c.o 的规则,只保留模式规则。

优化后的 Makefile 示例

CC = gcc

CFLAGS = -I.

OBJS = t.o mysum.o

DEPS = type.h

通过模式规则编译 .c 文件

%.o: %.c $(DEPS)

(CC) -c < -o $@

链接目标文件生成可执行文件

myt: $(OBJS)

(CC) (CFLAGS) -o @ ^

清理目标文件

clean:

rm -f $(OBJS) myt

这个版本删除了冗余的汇编部分,更简洁,易于理解和维护。

如果你有更多问题或进一步的需求,请随时告诉我!

相关推荐
Stanford_11063 小时前
如何利用Python进行数据分析与可视化的具体操作指南
开发语言·c++·python·微信小程序·微信公众平台·twitter·微信开放平台
@小博的博客3 小时前
【Linux探索学习】第二篇Linux的基本指令(2)——开启Linux学习第二篇
linux·运维·学习
千里马-horse4 小时前
Async++ 源码分析8--partitioner.h
开发语言·c++·async++·partitioner
Lucis__5 小时前
再探类&对象——C++入门进阶
开发语言·c++
openHiTLS密码开源社区5 小时前
【密码学实战】openHiTLS passwd命令行:专业密码哈希生成工具
linux·密码学·哈希算法·ldap·密码策略·随机盐值
WTCLLB5 小时前
netgear r6220 路由器,刷openwrt后,系统备份还原
linux·网络·智能路由器·openwrt
北京不会遇到西雅图6 小时前
【SLAM】【后端优化】不同优化方法对比
c++·机器人
迎風吹頭髮6 小时前
UNIX下C语言编程与实践38-UNIX 信号操作:signal 函数与信号捕获函数的编写
linux·c语言·unix
jndingxin6 小时前
c++多线程(6)------ 条件变量
开发语言·c++
做运维的阿瑞6 小时前
Linux系统性能监控与故障定位实战:CPU/内存/I/O/网络
linux·运维·网络