前面我们对Makefile的知识点进行描述,现在给出一个例子,来看看如何使用,顺便结束Makefile这个话题。
我们准备的文件目录和文件内容。如下:
代码语言:javascript复制$ tree
.
├── inc
│ ├── add.h
│ └── sub.h
├── Makefile
└── src
├── add.c
├── main.c
└── sub.c
其中Makefile的内容,如下:
代码语言:javascript复制VERSION = 1.0.0
SOURCE = $(wildcard ./src/*.c)
OBJECT = $(patsubst %.c, %.o, $(SOURCE))
INCLUEDS = -I ./inc
TARGET = rice
CC = gcc
CFLAGS = -Wall -g
$(TARGET): $(OBJECT)
@mkdir -p output/
$(CC) $^ $(CFLAGES) -o output/$(TARGET)_$(VERSION)
%.o: %.c
$(CC) $(INCLUEDS) $(CFLAGES) -c $< -o $@
.PHONY:clean
clean:
@rm -rf $(OBJECT) output/
分析:
行1:将版本号赋值给变量VERSION
行2:获取当前目录下src所有.c文件,并赋值给变量SOURCE。
行3:将./src目录下的.c结尾的文件,替换成.o文件,并赋值给OBJECT。
行4:通过-I选项指明头文件的目录,并赋值给变量INCLUDES。
行7:最终目标文件的名字rice,赋值给TARGET。
行8:替换CC的默认之cc,改为gcc。
行9:将 显示所有的警告信息选项和gdb调试选项赋值给变量CFLAGS。
行12:创建目录output,并且不再终端现实该条命令。
行13:可执行程序100ask,并将可执行程序生成到output目录,生成可执行文件的后缀添加版本号。
行16:将源文件生成对应的目标文件。
行18:伪目标,避免当前目录有同名的clean文件。
行20:用与执行命令make clean时执行的命令,删除编译过程生成的文件。
最后编译的结果,如下:
代码语言:javascript复制$ make
gcc -I ./inc -c src/main.c -o src/main.o
gcc -I ./inc -c src/add.c -o src/add.o
gcc -I ./inc -c src/sub.c -o src/sub.o
gcc src/main.o src/add.o src/sub.o -o output/rice
$tree
.
├── inc
│ ├── add.h
│ └── sub.h
├── Makefile
├── output
│ └── rice_1.0.0
└── src
├── add.c
├── add.o
├── main.c
├── main.o
├── sub.c
└── sub.o