如何写一个makefile

来源:互联网 发布:网络创业与实践课答案 编辑:程序博客网 时间:2024/05/16 12:16


第一版
目标:依赖
 命令
#命令前是tab键
test:main.o utils.o
 gcc -o main.o utils.o -lm
main.o:main.c
 gcc -c main.c -lm
utils.o:utils.c
 gcc -c utils.c -lm
#-lm是因为程序里用了math.h

========================================

第二版
常见的自动变量
$@:目标
$^:依赖的不重复全部项
$<:依赖的第一项
$*:不包含扩展名的目标文件名称
$+:所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件
$?:所有时间戳比目标文件晚的依赖文件,并以空格分开
$%:如果目标是归档成员,则该变量表示目标的归档成员名称
test:main.o utils.o
 gcc -o $@ $^ -lm
main.o:main.c
 gcc -c $^ -lm
utils.o:utils.c
 gcc -c $^ -lm
 

===============================================================

第三版
.c.o表示所有的 .o文件都是依赖与相应的.c文件 
test:main.o utils.o
 gcc -o $@ $^ -lm  
.c.o :
 gcc -c $< -lm


===================================================================

第四版
常见的预定义变量
AR             库文件维护程序的名称,默认值为ar
AS             汇编程序的名称,默认值为as
CC             C编译器的名称,默认值为cc
CPP           C预编译器的名称,默认值为$(CC) –E
CXX           C++编译器的名称,默认值为g++
FC              FORTRAN编译器的名称,默认值为f77
RM            文件删除程序的名称,默认值为rm –f
ARFLAGS   库文件维护程序的选项,无默认值
ASFLAGS   汇编程序的选项,无默认值
CFLAGS      C编译器的选项,无默认值
CPPFLAGS  C预编译的选项,无默认值
CXXFLAGS  C++编译器的选项,无默认值
FFLAGS       FORTRAN编译器的选项,无默认值

CC = cc
CFLAGS = -O
CFILES = *.c
LIBS=-lm
test:main.o utils.o
 $(CC) -o $@ $^ $(LIBS)
.c.o :
 $(CC) -c $< $(LIBS)
 
最后需要加上clean
scratch:
 make test
#clean无法执行的时候添加这个
 make clean
test:main.o utils.o
 gcc -o $@ $^ -lm  
.c.o :
 gcc -c $< -lm
#.PHONY:伪目标,不产生目标文件的意思
.PHONY: clean
clean:
 rm -f *.o

原创粉丝点击