包含子目录的makefile例子

来源:互联网 发布:软件开发工程师学习班 编辑:程序博客网 时间:2024/06/12 15:19

最近在看makefile和gcc方面东西,对于庞大的多级目录文件系统,如果要生成一个可执行文件,需要很好掌握包含子目录的makefile的写法

 

#=============================================

# 下面是 testmake/makefile 文件内容

#=============================================

SOURCES = $(wildcard *.c)

#当前目录下所有.c为源文件

OBJS = $(patsubst %.c, %.o, $(SOURCES))

#当前目录除去.c文件的.o文件

HEADERS = $(wildcard *.h)

#当前目录所有.h为头文件

STA_DIR = sta

#子目录名

SOURCES_STA = $(wildcard $(STA_DIR)/*.c)

#子目录源文件

OBJS_STA = $(patsubst %.c, %.o, $(SOURCES_STA))

#子目录.o文件

INCLUDE = -I./sta

#

TARGETS = teststa

#目标文件,就是最后生成的可执行文件名

 

all : STA $(TARGETS)

 

.PHONY: all clean

 

 

%.o : %.c 

$(CC) -c $(CFLAGS) $(INCLUDE) $^ -o $@

 

$(TARGETS):

#echo显示一些信息

@echo "sources_sta:" $(SOURCES_STA)

@echo "source : "$(SOURCES)

@echo "objs : " $(OBJS)

@echo "objs_sta "$(OBJS_STA)

$(CC) $(SOURCES) $(OBJS_STA) $^ -o $@

#编译当前目录和子目录的源文件,生成.o文件

STA:

@cd sta/;make all;

#切换到子目录

clean :

rm $(TARGETS) $(OBJS)

 

 

 

 

#=============================================

# 下面是 testmake/sta/makefile 文件内容 sta是子目录,下面存放公共代码

#=============================================

SOURCES = $(wildcard *.c)

OBJS = $(patsubst %.c, %.o, $(SOURCES))

HEADERS = $(wildcard *.h)

 

TARGETS = sta.a

all : $(TARGETS)

.PHONY: all clean

include $(SOURCES:.c=.d)

%.d: %.c

set -e; rm -f $@; /

$(CC) -MM $(CPPFLAGS) $< > $@.$$$$; /

sed 's,/($*/)/.o[ :]*,/1.o $@ : ,g' < $@.$$$$ > $@; /

rm -f $@.$$$$

 

@echo $(SOURCES)

@echo $(OBJS)

ar rcs $@ $^

 

clean :

rm $(TARGETS) $(OBJS)

 

teststc.c可以是一个main的空函数,不要是空文件!

 

 

 

原创粉丝点击