【问题标题】:Issue with Makefile in top level directory, sources in subdirectories顶级目录中的 Makefile 问题,子目录中的源
【发布时间】:2009-08-23 18:11:57
【问题描述】:

我有一个名为 project 的目录。

它包含两个名为clientserver 的子目录,以及一个名为Makefile 的makefile。

clientserver 分别获得了名为 client.cserver.c 的源文件。

对于属于该目录的源,我在子目录中没有任何单独的 makefile。所有构建都由单个 makefile 完成。 Makefile 代码是

FLAGS = -W -Wall -g -pthread

SERV =./server/server.c      #My server code 
CLI =./client/client.c       #My client code

build:svr cnt

svr: $(SERV) 
    cc $(FLAGS) $(SERV) -o ./server/server.out
cnt: $(CLI)
    cc $(FLAGS) $(CLI) -o ./client/client.out

现在我运行make cnt,它回复了

cc -W -Wall -g -pthread ./client/client.c -o ./client/client.out

问题是所有后续的make cnt 命令最终都会再次编译它并输出上述文本,即使我没有更改./client/client.c

我被困在这里了。不知道该怎么办。

我想做的是:

  • 使用make cnt,编译client/client.c并在client/目录下输出其可执行文件
  • 使用make svr,编译server/server.c并将其可执行文件输出到server/目录中。
  • 并使用make, compile bothserver/server.candclient/client.c` 并将其可执行文件输出到各自的目录中

但由于我没有任何名为 svr 和 `cnt 的可执行文件,所以我遇到的问题没有解决。

如果我将目标更改为./client/client.out 而不是cnt,然后调用make client/client.out 就可以了,这正是我需要的,但我不想在终端中输入长命令make client/client.out

我得到的解决方法如下

cnt: $(CLI)
         cc $(FLAGS) $(CLI) -o cnt
         cp cnt ./client/client.out

但不是很满意。我确定我想做的事情真的很简单,应该有一些方便的方法来做这件事。那我该怎么做呢?

【问题讨论】:

    标签: makefile subdirectory


    【解决方案1】:

    让我们制定你想要的。您希望不重建名为“cnt”的目标。您编写的makefile 对client.out 文件一无所知,因为它只出现在规则内的shell 命令中。 Make 程序不会从 shell 命令中读取信息,它只会在那里进行替换并执行它们。

    当makefile 选择它将重建的目标(`cnt' 是这些目标之一)时,它会将目标文件 的更新时间与其先决条件的更新时间进行比较。由于在您运行“make cnt”时没有名为 cnt 的文件,因此名为 so 的目标被认为需要更新。所以命令运行并且没有产生 名为 cnt 的文件,所以下一次 make run 也会考虑更新它。

    有两种可能的解决方案。第一个是为目标提供与文件相同的名称,规则命令将生成该名称。所以,你可能会变成这样:

    client/client.out: $(CLI)
        cc $(FLAGS) $(CLI) -o ./client/client.out
    

    顺便说一句,您的问题与目录无关。您还应该阅读 .PHONY 指令,使用 $(CC) 代替 cc 并阅读 gnu make manual,这可能会很有帮助。

    【讨论】:

      【解决方案2】:

      试试这个:

      伺服 =./server/server.out CLIO =./client/client.out .PHONY: srv cnt 构建 构建:svr cnt 服务端:$(伺服) cnt:$(CLIO) $(SERVO) $(CLIO): %.out : %.c cc $(标志) $^ -o $@

      现在您可以make srvmake cnt 或只是make
      您可以做一些更复杂的事情,但现在应该足够了。

      【讨论】:

      • 我无法关注它。我在制作 makefile 方面没有太多经验,所以我想我稍后会阅读手册。现在我将继续将 cnt 复制到我的客户目录。谢谢
      • 好吧,但无论你是否真的需要,你都会每次都重新制作 client.out。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      相关资源
      最近更新 更多