为2个目标创建makefile

为2个目标创建makefile,makefile,Makefile,通用条款4.4.1 C99 我正在创建一个客户机-服务器应用程序 我有一个编译所有文件的Makefile。但是,我想创建两个目标(二进制文件),一个叫做clt和svr。是否希望Makefile为它们创建两个单独的目录,分别为./client和./server 到目前为止,我已经对我的Makefile做了这些。这只会创建svr。我不确定如何为要创建的客户端添加第二个目标 希望你明白我的意思 非常感谢您的建议 OBJECT_FILES = server.o client.o cltsvr_ults.

通用条款4.4.1 C99

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

我有一个编译所有文件的Makefile。但是,我想创建两个目标(二进制文件),一个叫做clt和svr。是否希望Makefile为它们创建两个单独的目录,分别为./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 *~
使您的第一个(默认)目标取决于
clt
svr
目标

all:  svr clt

svr: ...
clt: ...
您还需要让
clt
svr
目标创建子目录

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

附录

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

clt:  cd clt; make $(MAKEFLAGS)
svr:  cd svr; make $(MAKEFLAGS)
这将生成一个子进程,以执行
clt
目录中的另一个
make
,以及
svr
子目录中的另一个
make
子进程。

使您的第一个(默认)目标取决于
clt
svr
目标

all:  svr clt

svr: ...
clt: ...
您还需要让
clt
svr
目标创建子目录

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

附录

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

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

这将生成一个子进程,以在
clt
目录中执行另一个
make
,并在
svr
子目录中执行另一个
make
子进程。

您也可以将
clt
的依赖关系图放在其中,并添加如下第一条规则:

all: svr clt

您也可以将
clt
的依赖关系图放在其中,并添加如下第一条规则:

all: svr clt

您还没有解释如何制作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 *~ SVR\u OBJECT\u FILES=server.o client.o cltsvr\u ults.o CLT_OBJECT_FILES=client2.o cltsvr_ults.o CFLAGS=-ggdb-Wall-pthread LIBS=-lpthread CC=gcc 全部:客户端/clt服务器/svr 客户端/clt:$(clt\U对象\U文件) 服务器/svr:$(svr\u对象\u文件) 客户端/clt服务器/svr: @mkdir-p$(dir$@) $(CC)$(CFLAGS)$^$(LIBS)-o$@ client.o client2.o server.o:cltsvr_ults.h %.o:%.c $(CC)-c$< 清洁: rm-f客户端/clt服务器/svr*.o*~
您还没有解释如何制作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 *~ SVR\u OBJECT\u FILES=server.o client.o cltsvr\u ults.o CLT_OBJECT_FILES=client2.o cltsvr_ults.o CFLAGS=-ggdb-Wall-pthread LIBS=-lpthread CC=gcc 全部:客户端/clt服务器/svr 客户端/clt:$(clt\U对象\U文件) 服务器/svr:$(svr\u对象\u文件) 客户端/clt服务器/svr: @mkdir-p$(dir$@) $(CC)$(CFLAGS)$^$(LIBS)-o$@ client.o client2.o server.o:cltsvr_ults.h %.o:%.c $(CC)-c$< 清洁: rm-f客户端/clt服务器/svr*.o*~
是的。默认情况下,一个point-make查找第一个目标,因此将“all”放在“svr”和“clt”目标之上。因此,第一条规则。但是是的,我想我可以把这一点说得更清楚。是的。默认情况下,一个point-make查找第一个目标,因此将“all”放在“svr”和“clt”目标之上。因此,第一条规则。但是,是的,我想我可以更清楚地说明这一点。“Makefile”不编译任何东西,也不创建任何目录。这只是一个文件!调用编译器和
mkdir
命令的是
make
程序,它将生成文件作为输入。因此,修复tagsl请参见“Makefile”不会编译任何内容,也不会创建任何目录。这只是一个文件!调用编译器和
mkdir
命令的是
make
程序,它将生成文件作为输入。所以,修复tagsl,这听起来是个更好的主意。但是,我的顶层目录如何调用子目录中的2个makefile?谢谢。通过做
cd-clt;make$(MAKEFLAGS)
,它生成一个子进程来执行子make。svr的目标也是如此。这听起来是个更好的主意。但是,我的顶层目录如何调用子目录中的2个makefile?谢谢。通过做
cd-clt;make$(MAKEFLAGS)
,它生成一个子进程来执行子make。对于
svr
目标,同上。“makefile应该可以”。。。“makefile…do”。。。来吧,Pavel,Makefile是代码,就像脚本一样。说“这个Makefile做X”而不是“这个Makefile使make做X”真的那么糟糕吗。。。“makefile…do”。。。来吧,Pavel,Makefile是代码,就像脚本一样。说“这个Makefile做X”而不是“这个Makefile使make做X”真的那么糟糕吗?