linux开发工具之Makefile(上)

一 make工具:
利用make工具可以自动完成编译工作。这些工作包括:
如果仅修改了某几个源文件,则指重新编译这几个源文件;如果某个头文件被修改了,则重新编译所有包含该头文件的源文件。利用这种自动编译可大大简化开发工作,避免不必要的重新编译

二 make工具是通过一个称为Makefile的文件来完成并维护编译工作的。Makefile文件描述了整个工程的编译、连接等规则。

三 Makefile基本规则
TARGET...(目标):DEPENDENCES...(依赖文件)
    COMMAND
    ...
目标(target)程序产生的文件:如可执行文件和目标文件;目标文件也可以是要执行的动作,如clean,也称为伪目标
依赖(DEPENDENCEs)是用来产生目标的输入文件列表。一个目标通常依赖于多个文件。

命令(COMMAND)是make执行的动作(命令是shell命令或者可在shell下执行的程序)注意:每个命令行的起始字符必须是TAB
如果DEPENDENCES中有一个或多个文件更新,就执行COMMAND命令来更新。

一个简单的Makefile

.PHONY:clean
main:main.o add.o sub.o
    gcc -Wall -g main.o add.o sub.o -o main
mian.o:mian.c
    gcc -Wall -g -c main.c -o main.o
add.o:...
    ...
sub.o:...
    ...
clean:
    rm -f main main.o add.o sub.o


clean 伪目标不是真正要生成的目标,没有依赖列表。加上一个.PHONY:clean显示指定clean为伪目标

四:Makefile自动化变量。去除一些重复内容


$@: 规则的目标文件名
$<: 规则的第一个依赖文件名
$^: 规则的所有依赖文件列表

.PHONY:clean
OBJECTS=main.o add.o sub.o
main: $(OBJECTS)
    gcc -Wall -g $^ -o $@
mian.o: mian.c
    gcc -Wall -g  -c $< -o $@
add.o: ...
    ...
sub.o: ...
    ...
clean:
    rm -f main $(OBJECTS)

    
    
再进一步改进

.PHONY:clean
CC=gcc
CFLAGS=-Wall -g
OBJECTS=main.o add.o sub.o
main:$(OBJECTS)
    $(CC)  $(CFLAGS)  $^  -o  $@
mian.o:mian.c
    $(CC)  $(CFLAGS)  -c  $<  -o  $@
add.o:...
    ...
sub.o:...
    ...
clean:
    rm -f main $(OBJECTS)

    

五、Makefile编译多个可执行文件

目录下有01test.c   02test.c

01test.c要生成01test   ......

%.o:%.c   等价于   .c.o:
.PHONY:clean all              #all也是伪目标,要生成all就要生成BIN
CC=gcc
CFLAGS=-Wall -g
BIN:01test 02test
all:$(BIN)
%.o:%.c                                #若不写规则,编译器会自动推导,将同名.c文件生成.o文件。再将.o文件自动推导生成目标文件(也可以自己生动添加规则) 01test: 01test.o    gcc  -Wall -g $^  -o $@
    $(CC)  $(CFLAGS) -c $< -o $@
clean:
    rm -f  *.o  $(BIN)



原文地址:https://www.cnblogs.com/wsw-seu/p/8228374.html