第十二章 多目录程序的Makefile

  注意:本章使用第十一章的源码 直接编译生成可执行文件 不在生成库

   一种简单的方法就是将所有源文件都设置到VPATH路径下。然后像普通makefile 生成。我们不讨论这种情况。

  

  先来看我们程序的目录组织结构 

  --- main.c

  ---common.h

  ---addsub

         --- add.c

       --- sub.c

  ---muldiv

      --- mul.c

      --- div.c

 

 

Makefile组织:

  1、各个子目录单独使用Makefile,主要生成相关的库,或者目标文件;
  
  2、顶层Makefile负责将本目录下源代码文件编译成目标文件,并依次进入各种子目录编译生成相关库文件,最后进行链接,生成可执行文件。
  
  该Makefile关键语句如下:
    
    for dir in $(SUBDIRS); \
    do $(MAKE) -C $$dir all || exit 1; \
    done
  
 
   意思是进入指定子目录,并执行子目录的Makefile文件(子目录只负责生成库文件)。
 
 
    
  
 addsub 子目录下makefile  
  
#*****************************************************************************

#

# Author           :   wolfRickWang

# Date             :   2013/7/17 星期三 13:27:22

#

#****************************************************************************/
SHELL = /bin/sh
CC = gcc
CFLAGS = -c 

SOURCES = add.c sub.c
OBJECTS = $(SOURCES:.c=.o)

all:$(OBJECTS)

%.o: %.c
    $(CC) $(CFLAGS) $< -o $@

clean:
    rm -f *.o

.PHONY: all clean


 muldiv 子目录下makefile   

#*****************************************************************************

#

# Author           :   wolfRickWang

# Date             :   2013/7/17 星期三 13:27:22

#

#****************************************************************************/
SHELL = /bin/sh
CC = gcc
CFLAGS = -c 

SOURCES = div.c mul.c
OBJECTS = $(SOURCES:.c=.o)

all:$(OBJECTS)

%.o: %.c
    $(CC) $(CFLAGS) $< -o $@

clean:
    rm -f *.o

.PHONY: all clean

 

   主目录makefile     

#*****************************************************************************

#

# Author           :   wolfRickWang

# Date             :   2013/7/17 星期三 13:27:22

#

#****************************************************************************/
SHELL = /bin/sh
CC = gcc
CFLAGS = -c 

EXECUTABLE = main
SUBDIRS := muldiv addsub

SOURCES = main.c
OBJECTS = $(SOURCES:.c=.o)


# add all sub obj
ALLOBJECTS = $(OBJECTS) ./muldiv/mul.o ./muldiv/div.o  ./addsub/add.o ./addsub/sub.o

all : $(EXECUTABLE)

# ALLOBJECTS 这里不能依赖这些文件,因为这些.o 在子目录makefile中生成,再此查找不到也找不到生成它们的方法 所以会出错
$(EXECUTABLE): $(OBJECTS)  
for dir in $(SUBDIRS);\ do make -C $$dir all || exit 1;\ done $(CC) $(ALLOBJECTS) -o $@ %.o: %.c $(CC) $(CFLAGS) $< -o $@ clean: for dir in $(SUBDIRS);\ do make -C $$dir clean|| exit 1;\ done rm -f *.o $(EXECUTABLE) .PHONY: all clean

 

 上面基本展示了一个多目录MAKEFILE书写的范例,现在如果要把上面的源文件换成库文件 也很容生成。 有兴趣的朋友可以尝试书写,本代码已经经过本人测试。

  

posted @ 2013-07-16 17:36  皁仩腄覺  阅读(247)  评论(0编辑  收藏  举报