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