linux下makefile多目錄編譯動、靜態庫

在待編譯的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


編譯結果出來了,一切正常!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章