多目录,多可执行文件的Makfile的编写

1.前言

在目前的工作中,我遇到这样的一个工作情景,可以认为我要开发一个库,这个库的有多个模块,每个模块的.c放到src中,.h放到include中,这应该是个标准做法。

drwxr-xr-x. 2 root root 4096 Mar 25 14:12 include
drwxr-xr-x. 2 root root 4096 Mar 25 16:08 obj
drwxr-xr-x. 8 root root 4096 Mar 25 12:12 programs
drwxr-xr-x. 2 root root 4096 Mar 25 14:12 src

然后希望产生的目标文件放到obj目录下。

因为我要对各个模块做多个测试,所以我有多个可执行文件,我把它们统一放到programs下面。

[root@localhost new_ttop]# ls programs/
config_test  find_p  list_test  readfile  second_test  ttop

如上图,config_test是对src中的几个模块进行测试,而list_test又是对src的另外几个模块进行测试。

我应该写一个什么样的Makefile来面对这种情况呢?

我是这样解决的,首先在顶层目录,创建一个Make.include文件,文件内容如下:

DIR_INC = ../../include
DIR_SRC = ../../src
DIR_OBJ = ../../obj
                     
SRC = $(wildcard ${DIR_SRC}/*.c)  
OBJ = $(patsubst %.c,${DIR_OBJ}/%.o,$(notdir ${SRC})) 
                     
                     
CC = gcc             
CFLAGS = -g -Wall -std=gnu99 -lpthread -I${DIR_INC}
LFLAGS = -lpthread   

然后在programs的子目录下,具体的程序中,再创建Makefile,下面是ttop的具体Makefile,对其他可执行文件来说,只需要改动BIN_TARGET

include ../../Make.include                    
                                              
BIN_TARGET = ttop                             
OBJ += $(BIN_TARGET).o                        
                                              
${BIN_TARGET}:$(OBJ)                          
    $(CC) $(LFLAGS) $^  -o $@                 
                                              
%.o:%.c                                       
    $(CC) $(CFLAGS) -c  $< -o $@              
                                              
${DIR_OBJ}/%.o:${DIR_SRC}/%.c                 
    $(CC) $(CFLAGS) -c  $< -o $@              
.PHONY:clean                                  
clean:                                        
    find ${DIR_OBJ} -name *.o |xargs rm -rf;                                                                                                                                           
    rm -f $(BIN_TARGET).o 

最终,我的文件的布局如下图所示。

 

参考:

http://www.groad.net/bbs/read.php?tid-2920-page-e.html

http://blog.csdn.net/liangkaiming/article/details/6267357

http://blog.csdn.net/zqt520/article/details/7727051

http://www.cnblogs.com/Anker/p/3242207.html

posted @ 2014-03-25 16:26  李可以  阅读(350)  评论(0编辑  收藏  举报