makefile自动编译

1.格式: 

目标:依赖

  规则    规则前有一个tab键 ,缺少tab键出错,使用空格替代也不可以

(1). 例子: 编写makefile 编译 main.c ,fun.c , fun.h

test:main.o fun.o
    gcc main.o fun.o -o test

fun.o:fun.c
    gcc -c fun.c -o fun.o
main.o:main.c
    gcc -c main.c -o main.o

.PHONY  #此行是防止,当前编译的目录下存在clean文件,不然报错
clean:
    rm *.o test

(2).  使用变量

# 使用变量代替比较长的编译工具名
CC=gcc
#使用变量代替较多的参数
CFLAGS=-c -Wall

test:main.o fun.o
    &(CC) main.o fun.o -o test

main.o:main.c
    $(CC) $(CFLAGS) main.c -o main.o
#    gcc -c main.c -o main.o -Wall    #不使用变量情况,使用变量时 用 $ 符取变量值

fun.o:fun.c
    &(CC) $(CFLAGS) fun.c -o fun.o

.PNOHY
clean:
    rm *.o test

  

(3). 自动变量
$*    不包含扩展名的目标文件名称
$+    所有的依赖文件,以空格分开,并且以出现的先后为序,可能包含重复的依赖文件
$<    第一个依赖文件的名称
$?     所有时间戳比目标文件晚的依赖文件,并以空格隔开
$@   目标文件的完整名称
$^     所有不重复的依赖文件,以空格隔开

CC=gcc
CFLAGS=-c -Wall

test:main.o fun.o
    $(CC) $^ -o $@  # $^ 所有不重复的依赖文件,以空格隔开

main.o:main.c
    $(CC) $(CFLAGS) $< -o $@  # $< 第一个依赖文件的名称,$@ 目标文件的完整名称
fun.o:fun.c
    $(CC) $(CFLAGS) fun.c -o fun.o

.PHONY
clean:
    rm *.o test

  

(4).  隐含规则

CC=gcc
CFLAGS=-c -Wall

# 隐含规则,注意目标文件必须是一个已存在的文件,下一行的规则没有,但需要tab键
main:mian.o fun.o   # 此处目标不能再写test了,必须是已存在的文件名
    

.PHONY
clean:
    rm *.o main

猜你喜欢

转载自www.cnblogs.com/electronic/p/11094900.html