分类: LINUX
2010-02-07 18:10:29
下面是一个用于编译多个模块软件的模板,它的优点就是每个目录一个Makefile文件,而且可以独立将Makefile文件中指定的源码文件编译为库,生成.a类型的库文件,用于编译成可执行文件或是模块库的发布,对我们公司来说很实用。原文中是一个C++的模板,由于我使用的是C,所以做了一些修改就可以编译C源码了。
下面是生成可执行文件的主Makefile文件,这个文件在一个工程中是唯一的。分享的那位老兄的的Makefile主文件在我的工程里不能将所有子目录的生成文件清理掉,经过我的修改(红色部分)已经可以了,原因是在使用cd切换路径后,循环变量里的相对路径就不能使用了,因此不能使用cd切换路径后make clean,而是应该在make clean时像前面编译的时候一样指定make的路径就可以顺利清除生成的obj、.d和.a类型的生成文件了。
################################################################################
#本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xuminggang/archive/2009/04/09/4056834.aspx
################################################################################
#cml 2010-02-07
################################################################################
#指定你要用的交叉编译器
#CC=/home/chailiang/emma3slp-prj/host-cross/mips-wrs-linux-gnu/bin/mips-wrs-linux-gnu-mips_softfp-glibc_small-gcc
#LD=/home/chailiang/emma3slp-prj/host-cross/mips-wrs-linux-gnu/bin/mips-wrs-linux-gnu-mips_softfp-glibc_small-ld
#AR=/home/chailiang/emma3slp-prj/host-cross/mips-wrs-linux-gnu/bin/mips-wrs-linux-gnu-mips_softfp-glibc_small-ar
#测试程序编译器
CC=gcc
AR=ar
################################################################################
#子路径和需要添加的库文件
SUBDIR1=./subdir1
SUBDIR1_1=./subdir1/subsub
SUBDIR2=./subdir2
SUBDIR2_1=./subdir2/subsub
SRC_DIRS:=$(SUBDIR1) $(SUBDIR1_1) $(SUBDIR2) $(SUBDIR2_1)
ARS:=$(SUBDIR1)/libsubdir1.a $(SUBDIR1_1)/libsubdir1_1.a $(SUBDIR2)/libsubdir2.a $(SUBDIR2_1)/libsubdir2_1.a
################################################################################
DIR=main
#自动添加被编译的C 文件
SOURCES:=$(wildcard *.c)
#自动生成.o 文件
OBJS:=$(subst .c,.o,$(SOURCES))
#添加依赖文件.d
DEPS:=$(subst .c,.d,$(SOURCES))
#添加头文件路径,注释部分为添加多个路径
################################################
#INCLDIR= ../control ../include ../port ../depinclude ../mxml/ \
# /home/chailiang/emma3slp-prj/build/linux/include/ \
# ../graphical/gif/include \
# ../graphical/jpeg/include \
# ../graphical/png/include \
# ../graphical/bmp/include
#CFLAGS=-Wall -O2 -D_REENTRANT -Wstrict-prototypes
#CFLAGS += $(addprefix -I,$(INCLDIR))
################################################
CINCLUDE:=/home/qt/maketest/include
CFLAGS = -g -Wall -I$(CINCLUDE)
###############################################################################
#所有的target
.PHONY: all $(SRC_DIRS) $(SRC_DIRS_FOR_CLEAN) clean
###############################################################################
all: $(SRC_DIRS) main
###############################################################################
#编译子目录下makefile 文件
$(SRC_DIRS):
$(MAKE) --directory=$@
###############################################################################
#编译生成main 可执行文件
main: $(OBJS) $(ARS)
$(CC) -o main $(OBJS) $(ARS)
###############################################################################
#以下为生成本目录下的.o文件
%.o:%.c
$(CC) $(CFLAGS) -c $<
###############################################################################
#生成文件依赖头文件关系
%.d:%.c
$(CC) -MM $(CFLAGS) $< > ; \
sed 's,\($*\)\.o[ :]*,\1.o $@:, g' < > $@; \
rm -f
include $(subst .c,.d,$(SOURCES))
###############################################################################
clean:
@for d in $(SRC_DIRS); \
do \
$(MAKE) clean --directory=$$d; \
done \
@-rm -f main *.o *.a *.d
###############################################################################
下面是各个子目录下,用于生成.a类型的库文件所使用的Makefile,使用时只需要修改路径就可以了。
###############################################################################
#本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xuminggang/archive/2009/04/09/4056834.aspx
###############################################################################
#cml 2010-02-07
###############################################################################
DIR=subdir2
SOURCES:=$(wildcard *.c)
OBJS:=$(subst .c,.o,$(SOURCES))
DEPS:=$(subst .c,.d,$(SOURCES))
CINCLUDE:=/home/qt/maketest/include
CFLAGS = -g -Wall -I$(CINCLUDE)
###############################################################################
#EMMA3SLP交叉编译器
#CC=/home/chailiang/emma3slp-prj/host-cross/mips-wrs-linux-gnu/bin/mips-wrs-linux-gnu-mips_softfp-glibc_small-gcc
#LD=/home/chailiang/emma3slp-prj/host-cross/mips-wrs-linux-gnu/bin/mips-wrs-linux-gnu-mips_softfp-glibc_small-ld
#AR=/home/chailiang/emma3slp-prj/host-cross/mips-wrs-linux-gnu/bin/mips-wrs-linux-gnu-mips_softfp-glibc_small-ar
#测试程序编译器
CC=gcc
AR=ar
###############################################################################
.PHONY: all clean
###############################################################################
#生成的库文件名
all:lib$(DIR).a
###############################################################################
lib$(DIR).a: $(OBJS)
$(AR) crv $@ $(OBJS)
###############################################################################
%.o:%.c
$(CC) $(CFLAGS) -c $<
###############################################################################
#生成依赖关系
%.d:%.c
$(CC) -MM $(CFLAGS) $< > ; \
sed 's,\($*\)\.o[ :]*,\1.o $@:, g' < > $@; \
rm -f
include $(subst .c,.d,$(SOURCES))
###############################################################################
clean:
-rm -f *.o *.a *.d
###############################################################################
chinaunix网友2010-06-30 16:04:09
你好!我跟你一样在做emma3sl的项目,编译器也是mips-wrs-linux-gnu,我发现它的编译器安装完好像不是标准的linux交叉编译器目录结构,因为我编译开源软件时找不到标C的头文件,不知道你是否遇到过这个问题?如何解决的?