Makefile入门知识

一、Makefile是什么?

        什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但是在linux系统中编译程序,makefile还是要懂,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。因为,makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。

二、使用步骤

1.Makefile语法
目标...:依赖文件集合
    命令1
    命令2
    ......
例如一个工程有main.c a.c b.c三个文件,我们要把三个文件编译成可执行的main文件,我们可以这样写Makefile
main:main.o a.o b.o
    gcc -o main main.o   a.o    b.o
main.o:mian.c
    gcc -c main.c
a.o:a.c
    gcc -c a.c
b.o:b.c
    gcc -c b.c
clean:
    rm *.o
    rm main

注意:每条命令都必须以TAB键开始,不能使用空格!!!

上述代码中一共有 5 条规则, 1~2 行为第一条规则, 3~4 行为第二条规则, 5~6 行为第三条
规则, 7~8 行为第四条规则, 10~12 为第五条规则, make 命令在执行这个 Makefile 的时候其执
行步骤如下:
首先更新第一条规则中的 main,第一条规则的目标成为默认目标,只要默认目标更新了那
么就认为 Makefile 的工作,完成了整个 Makefile 就是为了完成这个工作。在第一次编译的时候
由于 main 还不存在,因此第一条规则会执行,第一条规则依赖于文件 main.o、 a.o 和 b.o
这个三个.o 文件,这三个.o 文件目前还都没有,因此必须先更新这三个文件。 make 会查找以这
三个.o 文件为目标的规则并执行。以 main.o 为例,发现更新 main.o 的是第二条规则,因此会执
行第二条规则,第二条规则里面的命令为“gcc –c main.c”, 这行命令很熟悉了吧,就是不链接
编译 main.c,生成 main.o,其它两个.o 文件同理。最后一个规则目标是 clean,它没有依赖文件,
因此会默认为依赖文件都是最新的,所以其对应的命令不会执行,当我们想要执行 clean 的话
可以直接使用命令“make clean”,执行以后就会删除当前目录下所有的.o 文件以及 main,因此
clean 的功能就是完成工程的清理.

2.Makefile变量

示例:

objects = main.o input.o calcu.o
main: $(objects)
        gcc -o main $(objects)

=赋值符

作用:借助另外一个变量,可以将变量的真实值推到后面去定义。也就是变量的真实值取决于它所引用的变量的最后一次有效值。

:=赋值符

作用:赋值符“:=”不会使用后面定义的变量,只能使用前面已经定义好的

?=赋值符

作用:如果变量前面没有被赋值,那么此变量就是定义的变量,如果前面已经赋过值了,那么就使用前面赋的值。

变量追加“+=”

示例:

objects = main.o inpiut.o
objects += calcu.o

3.模式规则

模式规则中,至少在规则的目标定定义中要包涵“%”,否则就是一般规则,目标中的“%”
表示对文件名的匹配,“%”表示长度任意的非空字符串,比如“%.c”就是所有的以.c 结尾的文件,类似与通配符, a.%.c 就表示以 a.开头,以.c 结束的所有文件。当“%”出现在目标中的时候,目标中“%”所代表的值决定了依赖中的“%”值,使用方法如下:

%.o : %.c
        命令

示例:

objects = main.o input.o calcu.o
main: $(objects)
        gcc -o main $(objects)
%.o : %.c
         gcc -c $<
clean:
        rm *.o
        rm main

4.自动化变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Karl Zhangq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值