GNU make 使用笔记 (一)

转载请注明来源:http://blog.csdn.net/imred/article/details/50115257
(这是linux下make工具info page的笔记,主要是一些对原文翻译的记录和理解)

2.1 Rule长啥样

简单的makefile包含着一组rules,即一组规则。这些规则有以下格式:

目标 ... : 依赖的文件 ...
     命令
     ...
     ...

目标:一般是需要由编译器生成的文件的名字,比如说.o文件或可执行文件。也可以是你指定的一组命令的名字,比如说clean(在clean这个目标后面的命令列表你就可以指定一组清除中间文件的命令)。
依赖的文件:生成目标需要的文件,比如.c,.h,.o文件。
命令:make工具会代你执行的命令,可以有多个。特别注意命令前面一定要加一个tab(\t)。
大多数情况下,需要重新生成目标时,make工具会执行你指定的命令,生成规则指定的目标。但有时候目标没有依赖的文件,比如上面提到的clean目标。
是否需要重新生成目标取决于依赖的文件,一般来说,当依赖的文件被创建或更新过以后,make会执行你指定的命令生成新的目标。但也有例外,比如目标代表一组操作的时候,例如clean。

2.2 一个简单的Makefile

下面的命令会生成一个名为edit的可执行文件,这个可执行文件由8个c源文件编译而成,每个c源文件都包含一些头文件:

edit : main.o kbd.o command.o display.o \
       insert.o search.o files.o utils.o
        cc -o edit main.o kbd.o command.o display.o \
                   insert.o search.o files.o utils.o

main.o : main.c defs.h
        cc -c main.c
kbd.o : kbd.c defs.h command.h
        cc -c kbd.c
command.o : command.c defs.h command.h
        cc -c command.c
display.o : display.c defs.h buffer.h
        cc -c display.c
insert.o : insert.c defs.h buffer.h
        cc -c insert.c
search.o : search.c defs.h buffer.h
        cc -c search.c
files.o : files.c defs.h buffer.h command.h
        cc -c files.c
utils.o : utils.c defs.h
        cc -c utils.c
clean :
        rm edit main.o kbd.o command.o display.o \
           insert.o search.o files.o utils.o

其中的那些反斜杠是为了把一个长命令分隔到两行。
使用的时候在在代码目录(同时包含该makefile文件)键入make就可以了,它会生成你第一条规则指定的目标(因为它依赖于8个.o文件,所以后面的规则实际上也会执行),要清除那些中间的.o文件键入make clean就可以了。
某个目标A也可能成为另一个目标B的依赖的目标,因此要先生成目标A才能生成目标B,当A依赖的文件更新后,A和B都会更新,make会自动先更新A然后更新B。
为什么make clean需要手动执行,首先因为clean不在任何文件的依赖列表中,不存在为了生成一个文件先要执行一些命令来生成clean的情况;其次,它也没有依赖文件,因此也不存在依赖文件更新后需要重新生成clean的情况。因此要指定生成clean。(虽然没有生成一个叫做clean的文件,但make工具并不知道,它只是原样的执行你指定的命令)
(这是info page最开始的一部分,虽然内容不多,但也可以简化你的很多操作了,比如,你可以把gcc -o main -std=c99 main.c -lxxx -lxxx -lxxx写成下面一条规则放在makefile中,以后直接make就可以编译了:

main : main.c
    gcc -o main -std=c99 main.c -lxxx -lxxx -lxxx

)
转载请注明来源:http://blog.csdn.net/imred/article/details/50115257

你可能感兴趣的:(Linux,gnu,编译器,makefile,linux)