你的位置:首页 > 操作系统

[操作系统]Linux开发工具之Makefile(上)


二、makefile
01.make工具
  利用make工具可以自动完成编译工作。这些工作包括:如果修改了某几

个源文件,则只重装新编译这几个源文件;如果某个头文件被修改了,则

重新编译所有包含该头文件的源文件。利用这个自动编译可大大简化开发

工作,避免不必要的重新编译。

  make工具通过一个称为Makefile的文件来完成并自动维护编译工作。

Makefile文件描述了整个工程的编译、链接等规则。
02.Makefile的基本规则:
  TARGET...:DEPENDENCIES...
COMMAND
...
  目标(TARGET)程序产生的文件,如何执行文件和目标文件;目标也可

以是要执行的动作,如clean,也成为伪目标。
  依赖(DEPENDENCIES)是用来产生目标的输入文件列表,一个目标通常依

赖于多个文件。
  命令(command)是make执行的动作(命令是shell命令或是可在shell

下执行的程序)。注意:每个命令行的起始字符必须为TAB字符!
  如果DEPENDENCIES中有一个或多个文件更新的话,COMMAND就要执行,

这就是Makefile最核心的内容

#touch main.c add.c sub.c add.h sub.h
#ls
main.c add.c sub.c add.h sub.h
#vi main.c
int main()
{
return 0;
}
#vi Makefile
main:main.o add.o sub.o
gcc -Wall -g main.o add.o sub.o -o main
main.o:main.c
gcc -Wall -g -c main.c -o main.o
add.o:add.c add.h
gcc -Wall -g -c add.c -o add.o
sub.o:sub.c sub.h
gcc -Wall -g -c sub.c -o sub.o

#make(默认生成第一个目标)
#ls
main
#make(文件没有变化)
make:'main' id up to date
#touch sub.h(重新生成sub.h)
#make
gcc -Wall -g -c sub.c -o sub.o
gcc -Wall -g main.o add.o sub.o -o main


clean:(伪目标,并不是要生成的文件,用来删除这些文件)
rm -f main main.o add.o sub.o
#make clean
将链接文件全部删除

#make main.o
只生成main.o这个文件

.PHONY:clean(Makefile文件的最开头.表示clean是一个伪目标)
如果Makefile所在的文件夹下,存在clean文件,则执行make clean时会

提示:make:'clean'is up to date.

03.Makefile自动化变量
$@:规则的目标文件名
$<:规则的第一个依赖文件名
$^:规则的所有依赖文件列表

#vi Makefile.1
.PHONY:clean
OBJECTS=main.o add.o sub.o
main:$(OBJECTS)
gcc -Wall -g $^ -o $@
main.o:main.c
gcc -Wall -g -c $< -o $@
add.o:add.c add.h
gcc -Wall -g -c $< -o $@
sub.o:sub.c sub.h
gcc -Wall -g -c $< -o $@
clean:
@(加@不会打印在屏幕上)echo "begin delete..."(命令还是要

执行)
rm -f main $(OBJECTS)
#make
(正常工作)
#make clean
(正常工作)

#make clean -f Makefile.1
(以Makefile.1的规则来执行clean这个命令)
begin delete...
rm -f main main.o add.o sub.o

04.Makefile编译多个可执行文件
  模式规则:%.o:%.c
  后缀规则:.c.o

#mkdir 01
#mv *.c 01
#ls
#mv *.* 01
#ls
01 Makefile
#mv Makefile 01
#ls
#mkdir 02
#cd 02
#touch 01test.c 02test.c(01test.c,02test.c都要生成可执行文件)
#vi 01test.c 
int main(void)
{
return 0;
}
#vi02test.c
int main(void)
{
return 0;
}
#vi Makefile
.PHONY:clean
BIN=01test 02test
all:$(bin)
01test:01test.o
gcc -Wall -g  $^ -o $@
02test:02test.o
gcc -Wall -g  $^ -o $@
clean:
rm -f *.o $(BIN)
#make
01test 02test
#vi Makefile
BIN依赖两个文件
all这个目标依赖BIN两个文件
编译器自动将同名的"*.c"文件生成同名可执行文件
#make
cc 01test.c -o 01test
cc 02test.c -o 02test
#make clean
#ls
01test.c 02test.c Makefile
#make
cc -c -o 01test.o 01test.c
gcc -Wall -g -c 01test.o -o 01test
#make clean
#ls
01test.c 02test.c Makefile
#vi Makefile
%.o:%.c(将对应的.c文件生成.o文件)
gcc -Wall -g -c $< -o $@
#make clean
#make
#ls

#vi Makefile
CC=gcc
CFLAGS=-Wall -g
#%.o:%.c
# $(CC) $(CFLAGS) -c $< -o $@
.c.o:
$(CC) $(CFLAGS) -c $< -o $@
01test:01test.o
$(CC) $(CFLAGS) $^ -o $@
02test:02test.o(将光标定位到这里,输入2yy,复制两行)
$(CC) $(CFLAGS) $^ -o $@
(点击p,复制到这里)
#make clean
#make
#ls
#vi 03test.c
int mian(void)
{
return 0;
}