一个完整的工程文件结构可以通过
#tree 这个命令查看
比如
|-- Makefile
|-- add
| |-- Makefile
| `-- src
| |-- add.c
| `-- add.o
|-- cal
|-- div
| |-- Makefile
| `-- src
| |-- div.c
| `-- div.o
|-- mul
| |-- Makefile
| `-- src
| |-- mul.c
| `-- mul.o
|-- scripts
| `--Makefile
|-- sub
| |-- Makefile
| `-- src
| |-- sub.c
| `-- sub.o
`-- test
|-- Makefile
`-- src
|-- main.c
`-- main.o
1.scripts /Makefile
(在脚本功能目录下的Makefile主要进行一些变量赋值,在编写时编者需要了解基本的赋值语句,在这里以#开头均为
注解)
CC := gcc -lpthread -lsqlite3
Target := chat_client
Source := $(wildcard src/*.c)
Objs := $(patsubst %.c,%.o,$(Source))
Modules += main check_action create_msg interface interface1 set_disp_mode thread_read thread_write
Allobjs := $(addsuffix /src/*.o,$(Modules))
2.总控Makefile (在总控Makefile中主要执行进入各个子目录中读取Makefile并进行make编译的嵌套功能)
可以理解为:
1.进入各个子目录进行make命令
2.把每个功能目录下的.o文件链接组成可执行文件
include scripts/Makefile
modules_make = $(MAKE) -C $(1);
modules_clean = $(MAKE) clean -C $(1);
.PHONY: all mm mc clean
all : $(Target)
mm:
@ $(foreach n,$(Modules),$(call modules_make,$(n)))
mc:
@ $(foreach n,$(Modules),$(call modules_clean,$(n)))
$(Target) : mm
@$(CC) -o $(Target) $(Allobjs) -lsqlite3 -lpthread
clean : mc
@rm -rf $(Target)
3.功能块Makefile (在各个独立的子功能块编写Makefile文件)
可以把程序分成各个功能块,每个功能目录下都有一个src 目录存放功能 的.c文件,另外还有makefile文件,这个makefile文件能将.c转化为.o文件