学习资源: 笨方法学C语言中文版

     笨方法学C语言配套视频

     笨方法学C语言官方github仓库

     Make命令教程-阮一峰的网络日志

习题2 使用Makefile构建程序

跟着书上做

1 打开终端,进入demo文件夹,分别输入 make ex1 和 CFLAGS="-Wall" make ex1 命令,如下图:

笨方法学C语言 学习记录 习题2_Makefile

由于在习题1中已经生成了ex1文件且没有改动源文件,故显示ex1已是最新,使用rm ex1命令删除ex1文件,重新生成即可。

rm 命令会删除文件,后面写要删除的文件名

CFLAGS="-Wall"为修饰符,放在make命令之前,修饰符会在生成时产生一些别的效果,后面还会遇到,到时候会更加明白。

2 打开Ubuntu自带的文本编辑器,先保存,文件命名为Makefile,位置为demo文件夹下,无后缀,如下图:

笨方法学C语言 学习记录 习题2_笨方法学C语言_02

3 完成上一步保存后,会回到文本编辑器编辑页面,在文件中写入如下图中内容并保存:

笨方法学C语言 学习记录 习题2_C语言_03

注意第4行代码前面空白为一个缩进,请不要使用空格,而是使用tab键

4 在终端进入demo文件夹的情况下,执行下图中的make相关命令:

笨方法学C语言 学习记录 习题2_Makefile_04

输出与书上一致。

破坏Makefile

1 将Makefile第4行的缩进删除并保存,再在终端执行make clean命令,输出如下图:

笨方法学C语言 学习记录 习题2_Makefile_05

提示没有分隔符并且停止了执行命令,并没有删除ex1文件

2 将Makefile第4行的缩进换成4个空格并保存,再在终端执行make clean,同样会提示缺失分隔符,如下两图:

笨方法学C语言 学习记录 习题2_笨方法学C语言_06

笨方法学C语言 学习记录 习题2_Makefile_07

破坏完成之后,请复原Makefile

附加任务

1 创建 all:ex1目标,放在修饰符后面,所有目标的第一个,并保存,如下图:

笨方法学C语言 学习记录 习题2_Makefile_08

这样只需要在终端执行make命令就可以构建ex1了。如下图:

笨方法学C语言 学习记录 习题2_C语言_09

我先删除ex1再直接使用make,而不是make ex1就可以构建ex1了。

Makefile学习

关于Makefile现阶段我需要的东西已经写在下方代码和注释中了,注释采用Makefile语法,用#表示注释

CFLAGS=-Wall -g # 修饰符放在Makefile前面

all:ex1 ex2 ex3
# all 为目标文件,即要生成的文件,冒号后面为生成所需要的依赖文件。
# 依赖文件名称为C语言源文件名称(无后缀)时,make在生成时会自动将源文件编译生成无后缀可执行文件
# 所以执行第3行时会自动将所处目录下的ex1.c,ex2.c和ex3.c编译
# 编译是按照顺序的,如果ex2.c不存在那么命令执行至ex2便停止,后面的ex3不会被检查
.PHONY:clean # 这是一个伪目标声明,语法为.PHONY冒号伪目标名
# 第8行将clean声明为伪目标,告诉make不要真正去生成clean,而只执行clean下的命令
clean: #clean已经被声明为伪目标,make clean命令不会生成名为clean的文件,而是只会执行下面两行命令
# 一般目标名冒号后面不写依赖文件,make会自动将目标视为伪目标,不生成文件只执行命令,因而.PHONY声明并不总是必须的
# 但若是所处文件目录下已经有伪目标的同名文件,则make会认为没有必要再生成,也就不会执行伪目标下命令
# 这种情况.PHONY声明就是必须的
	rm -f ex1
  rm -f ex2
# Makefile基本上就是这种格式,目标冒号依赖,然后换行缩进,之后就是写命令,如下面格式
target1 target2:pre1 pre2 pre3 pre4
	command1
  command2
  command3
# 这就是告诉make要生成哪些文件,生成这些文件需要什么文件,然后命令就是告诉make怎么生成
# 当然伪目标不会生成文件,这一点已经说过
# 写好Makefile后,在终端直接输入make会默认执行第一个目标,就是写在最前面的目标
# 指定执行目标只需在make后加上目标名即可,如书上的make clean即是指定执行clean目标
# 不过clean是伪目标,所以只会执行clean下面的命令
# 如果我们想只执行命令,不需要生成文件,也用伪目标即可,也就是不写依赖
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.