Makefile 简单总结

简要说明

CFLAGS=-g       #在每一条gcc -c 之后附加-g,使之可以使用gdb调试
#定义变量
objects = main.o command.o
#第一个目标为最后生成的目标
edit : $(objects)
    cc -o $@ $^ #代表"cc -o edit $(objects)", cc是unix中常用编译器,linux下指向gcc.

main.o : main.c defs.h
    cc -c main.c
command.o : command.c defs.h command.h
    cc -c command.c

#.PHONY表示,clean是个伪目标文件,可以理解为是一个动作,一般用来清除make生成的文件。也可以是其它名字,通过make xxx来执行。
.PHONY clean
clean :
    -rm edit $(objects) #减号表示忽略错误

make能自动推导和.o文件相同文件名的.c文件。于是可以简化成这样子:

objects = main.o command.o
edit : $(objects)
    cc -o edit $(objects)
main.o : defs.h
command.o :defs.h command.h
.PHONY clean
clean :
    -rm edit $(objects)

其中main.o 和 command.o都依赖了defs.h, 可以写成这样(不推荐这种写法,易混乱):

objects = main.o command.o
edit : $(objects)
    cc -o edit $(objects)
main.o command.o : defs.h
command.o :command.h
.PHONY clean
clean :
    -rm edit $(objects)

单目录下通用的Makefile

#for c
EXE=main
CC=gcc
SRC=$(wildcard *.c)
OBJ=$(SRC:.c=.o)
DEP=$(patsubst %.c,.%.d,$(SRC))
CFLAGS=-g
$(EXE):$(OBJ)
    $(CC) $^ -o $@

$(DEP):.%.d:%.c
    @set -e;\
    rm -f $@;\
    $(CC) -M $< > $@.$$$$;\
    sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@;\
    rm -f .*.d*

-include $(DEP)

clean:
    @rm $(EXE) $(OBJ) $(DEP) -f

#for c++
EXE=main
CC=g++
SRC=$(wildcard *.cpp)
OBJ=$(SRC:.cpp=.o)
DEP=$(patsubst %.cpp,.%.d,$(SRC))
CFLAGS=-g
$(EXE):$(OBJ)
    $(CC) $^ -o $@

$(DEP):.%.d:%.cpp
    @set -e;\
    rm -f $@;\
    $(CC) -MM $< > $@.$$$$;\
    sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@;\
    rm -f .*.d*

-include $(DEP)

clean:
    @rm $(EXE) $(OBJ) $(DEP) -f

其它细节

  1. make 支持的默认文件名:”GNUmakefile”、”makefile”、”Makefile”, 可以用make -f filename指定makefile.
  2. include foo.mk 包含其它makefile文件
  3. 默认会include 环境变量MAKEFILES 中的makefile,不建议设置这个变量。

参考链接

http://blog.csdn.net/ruglcc/article/details/7814546/
http://www.lxway.com/44189092.htm

你可能感兴趣的:(linux,makefile)