在待編譯的project目錄下有以下文件:
[00:32 @ program ]$ tree ./project/
./project/
|-- main.c
|-- makefile
|-- module1
| |-- m1_file1.c
| |-- m1_file1.h
| |-- m1_file2.c
| |-- m1_file2.h
| `-- makefile
`-- module2
|-- m2_file1.c
|-- m2_file1.h
|-- m2_file2.c
|-- m2_file2.h
`-- makefile
2 directories, 12 files
進入project目錄,用Vim編輯主makefile文件
BINARY_NAME = app.out
CFLAGS = -Wall
CC = gcc
MAKE = make
SUBDIRS := module1 module2
LIBS := module1/libmodule1.a module2/libmodule2.so
LDFLAGS = $(LIBS)
SRCS := $(shell ls *.c)
OBJS := $(patsubst %.c, %.o, $(SRCS))
all: $(BINARY_NAME)
$(BINARY_NAME): $(OBJS)
for dir in $(SUBDIRS); \
do \
$(MAKE) -C $$dir || exit 1; \
done
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
$(OBJS): $(SRCS)
$(CC) $(CFLAGS) -c $^ -I./module1/ -I./module2 -o $@
.PHONY: clean
clean:
rm -f *.o $(BINARY_NAME)
之後進入project/module1目錄,編寫makefile文件
#Set the parameter
BINARY_NAME = app.out
LIB_NAME = libmodule1.a
STATIC_FLAG = YES
CFLAGS = -Wall
CC = gcc
#Dynamic compiled or Static compiled
ifeq ("$(STATIC_FLAG)", "YES")
LD_AR = ar
MODE = -rcs
else
LD_AR = ld
MODE = -shared
endif
export CC LD_AR
#list all of the C file
SRCS := $(shell ls *.c)
#list all of the object file
OBJS := $(patsubst %.c, %.o, $(SRCS))
#compling
$(LIB_NAME): $(OBJS)
$(LD_AR) $(MODE) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $^
.PHONY: clean
clean:
rm -f *.o $(LIB_NAME)
# rm -f $(BINARY_NAME)
我寫的動態庫和靜態庫中的makefile都是一樣的,只是標誌位不同,所以就不寫出來了。
最後,在project目錄下,輕輕的make一下,OK,搞定了。
在tree一下看看:
[00:50 @ project ]$ tree
.
|-- app.out
|-- main.c
|-- main.o
|-- makefile
|-- module1
| |-- libmodule1.a
| |-- m1_file1.c
| |-- m1_file1.h
| |-- m1_file1.o
| |-- m1_file2.c
| |-- m1_file2.h
| |-- m1_file2.o
| `-- makefile
`-- module2
|-- libmodule2.so
|-- m2_file1.c
|-- m2_file1.h
|-- m2_file1.o
|-- m2_file2.c
|-- m2_file2.h
|-- m2_file2.o
`-- makefile
2 directories, 20 files
編譯結果出來了,一切正常!