2018-07-27 00:28:58 +0000   |     algorithm leetcode makefile   |   Viewed times   |    

这不是教程

这不是一个系统的makefile教程。教程网上很多。这里只是摘录几个常用makefile片段作为良好实践的案例。

获取所有.c源文件,以及.o目标文件

用通配符获得特定(当前)文件夹下所有.c源文件

src = $(wildcard *.c)

既可以用patsubst函数将.c全部替换成.o,以获取全部.o目标文件,

obj = $(patsubst %.c,%.o,$(wildcard *.c))

也可以用冒号:做静态模式替换,

obj = $(src: .c: .o)

利用隐性规则编译并链接

makefile默认的隐性规则是:

默认.o目标文件的依赖文件为同名.c源文件,并使用命令cc –c $(CFLAGS) foo.c来生成foo.o

所以下面简短的两行命令就能把目录下所有.c源文件编译成.o目标文件,然后再链接成一个可执行文件myprog

myprog: $(obj)
    $(CC) -o $@ $^ $(LDFLAGS)

命令中的$(CC)变量是像gcc这样的编译器,$@指代最终的可执行文件,$^代表全部.o目标文件。$(LDFLAGS)代表编译时的附加选项。

能处理%99自己小程序的通用makefile

src = $(wildcard *.c)
obj = $(src:.c=.o)

LDFLAGS = -lGL -lglut -lpng -lz -lm

myprog: $(obj)
    $(CC) -o $@ $^ $(LDFLAGS)

.PHONY: clean
clean:
    rm -f $(obj) myprog

参考文献

http://nuclear.mutantstargoat.com/articles/make/