【问题标题】:creating a makefile for 2 targets为 2 个目标创建生成文件
【发布时间】:2009-11-10 16:45:10
【问题描述】:

gcc 4.4.1 C99

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

我有一个编译所有文件的 Makefile。但是,我想 2 创建 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 *~

【问题讨论】:

  • "Makefile" 不会编译任何东西,也不会创建任何目录。 它只是一个文件! 调用编译器和mkdir 命令的是make 程序,它将您的Makefile 作为输入。所以,修复标签另见meta.stackexchange.com/questions/24030/…

标签: makefile


【解决方案1】:

您还没有解释如何制作 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 全部:客户端/clt 服务器/svr 客户端/clt:$(CLT_OBJECT_FILES) 服务器/服务器:$(SVR_OBJECT_FILES) 客户端/clt 服务器/svr: @mkdir -p $(dir $@) $(CC) $(CFLAGS) $^ $(LIBS) -o $@ client.o client2.o server.o: cltsvr_ults.h %.o: %.c $(CC) -c $&lt 干净的: rm -f 客户端/clt 服务器/svr *.o *~

【讨论】:

  • “makefile 应该做”...“makefile...做”... sigh
  • 哦,帕维尔,Makefile 就是代码,就像脚本一样。说“这个 Makefile 做 X”,而不是“这个 makefile 使 make to do X”真的那么糟糕吗?
【解决方案2】:

使您的第一个(默认)目标依赖于cltandsvr 目标。

all:  svr clt

svr: ...
clt: ...

您还需要cltandsvr 目标创建子目录。

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

附录

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

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

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

【讨论】:

  • 这听起来是个好主意。但是,我的顶级目录如何调用子目录中的 2 个 makefile?谢谢。
  • 通过cd clt; make $(MAKEFLAGS) 生成一个子进程来执行子制作。 svr 目标也是如此。
【解决方案3】:

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

all: svr clt

【讨论】:

  • 是的。有一点 - make 默认查找第一个目标,因此将“all”放在“svr”和“clt”目标之上。
  • 因此 first 规则。但是,是的,我认为我本可以更清楚地说明这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-26
  • 1970-01-01
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多