Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19658
  • 博文数量: 4
  • 博客积分: 120
  • 博客等级: 入伍新兵
  • 技术积分: 45
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-15 15:12
文章分类

全部博文(4)

文章存档

2011年(1)

2010年(2)

2008年(1)

我的朋友
最近访客

分类: LINUX

2010-02-07 18:10:29

在Linux下编译一个较大的工程时,编写Makefile对一个初学者来说是一个比较困难的事情,至少对我来说是这样的,这都是受多年使用Window积累下来的短板,好在有很多朋友能够慷慨的分享,坚持开源的理念,向他们致敬。

  下面是一个用于编译多个模块软件的模板,它的优点就是每个目录一个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
###############################################################################

阅读(2047) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-06-30 16:04:09

你好!我跟你一样在做emma3sl的项目,编译器也是mips-wrs-linux-gnu,我发现它的编译器安装完好像不是标准的linux交叉编译器目录结构,因为我编译开源软件时找不到标C的头文件,不知道你是否遇到过这个问题?如何解决的?