为2个目标创建一个makefile

时间:2009-11-10 16:45:11

标签: makefile

gcc 4.4.1 C99

我正在创建一个客户端服务器应用程序。

我有一个编译所有文件的Makefile。但是,我想创建2个目标(二进制文件),一个名为clt和svr。并希望Makefile为它们创建2个单独的目录,称为./client和./server?

到目前为止,我已经对我的Makefile做了这个。这只会创造svr。我不确定如何为要创建的客户端添加第二个目标。

希望你理解我的观点?

非常感谢任何建议,

OBJECT_FILES = server.o client.o cltsvr_ults.o

CFLAGS = -ggdb -Wall -pthread

LIBS = -lpthread

CC = gcc

svr: $(OBJECT_FILES)
    $(CC) $(CFLAGS) $(OBJECT_FILES) $(LIBS) -o svr

client.o: client.c cltsvr_ults.h
    $(CC) -c client.c

server.o: server.c cltsvr_ults.h
    $(CC) -c server.c

cltsvr_ults.o: cltsvr_ults.c
    $(CC) -c cltsvr_ults.c

clean:
    rm svr *.o *~

3 个答案:

答案 0 :(得分:6)

你还没有解释如何制作clt,进入它的对象是什么。 svr的对象列表看起来很奇怪 - 它应该真的有client.o吗?我将假设clt由client2.o和cltcvr_ults.o组成。这个makefile应该做你想要的,包括制作目录:

SVR_OBJECT_FILES = server.o client.o cltsvr_ults.o
CLT_OBJECT_FILES = client2.o cltsvr_ults.o  

CFLAGS = -ggdb -Wall -pthread
LIBS = -lpthread 
CC = gcc  

all: client/clt server/svr
client/clt: $(CLT_OBJECT_FILES) 
server/svr: $(SVR_OBJECT_FILES)  

client/clt server/svr:
    @mkdir -p $(dir $@)
    $(CC) $(CFLAGS) $^ $(LIBS) -o $@  

client.o client2.o server.o: cltsvr_ults.h  

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

clean: 
    rm -f client/clt server/svr *.o *~ 

答案 1 :(得分:4)

让您的第一个(默认)目标取决于cltsvr目标。

all:  svr clt

svr: ...
clt: ...

您还希望让cltsvr目标创建子目录。

另一种可能更好的方法是将所有服务器代码移动到其自己的目录中,同样将所有客户端代码移动到其自己的目录中。 (这假设你可以很好地将代码分成两部分。)然后在顶层目录中有一个小的Makefile,其目标在每个子目录中执行Makefile。

<强>附录

通过为每个子目录编写如下规则,使顶级Makefile调用子目录中的Makefile:

clt:  cd clt; make $(MAKEFLAGS)
svr:  cd svr; make $(MAKEFLAGS)

这会产生一个子进程来执行make目录中的另一个clt,以及make子目录的另一个svr子进程。

答案 2 :(得分:3)

您也可以将clt的依赖关系图放在那里,然后添加第一条规则:

all: svr clt