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 *~
答案 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)
让您的第一个(默认)目标取决于clt
和svr
目标。
all: svr clt
svr: ...
clt: ...
您还希望让clt
和svr
目标创建子目录。
另一种可能更好的方法是将所有服务器代码移动到其自己的目录中,同样将所有客户端代码移动到其自己的目录中。 (这假设你可以很好地将代码分成两部分。)然后在顶层目录中有一个小的Makefile,其目标在每个子目录中执行Makefile。
<强>附录强>
通过为每个子目录编写如下规则,使顶级Makefile调用子目录中的Makefile:
clt: cd clt; make $(MAKEFLAGS)
svr: cd svr; make $(MAKEFLAGS)
这会产生一个子进程来执行make
目录中的另一个clt
,以及make
子目录的另一个svr
子进程。
答案 2 :(得分:3)
您也可以将clt
的依赖关系图放在那里,然后添加第一条规则:
all: svr clt