Makefile的实战例子

2022-05-10 08:42:45 浏览数 (1)

前面我们对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

0 人点赞