【问题标题】:How to make a single "makefile" create 3 output binaries如何使单个“makefile”创建 3 个输出二进制文件
【发布时间】:2018-04-05 06:35:25
【问题描述】:

谁能帮我为我的项目创建一个makefile?我需要从 makefile 创建 3 个二进制文件。

二进制文件像这样单独编译:

gcc -D_POSIX_SOURCE -Wall -Werror -pedantic -std=c99 -D_GNU_SOURCE -pthread main.c service_client_socket.c service_listen_socket.c get_listen_socket.c -o serverThreaded

gcc -D_POSIX_SOURCE -Wall -Werror -pedantic -std=c99 -D_GNU_SOURCE -pthread main.c service_client_socket.c service_listen_socket.c get_listen_socket.c -o server

(因此它创建了 2 个相同的二进制文件,但名称不同,serverThreaded 和 server)

而且我也需要 makefile 中的这个:

gcc -D_POSIX_SOURCE -Wall -Werror -pedantic -std=c99 -D_GNU_SOURCE -pthread client.c -o client

编辑:我认为这是我需要的?

all: serverThreaded server client

    gcc -D_POSIX_SOURCE -Wall -Werror -pedantic -std=c99 -D_GNU_SOURCE -pthread main.c service_client_socket.c service_listen_socket.c get_listen_socket.c -o serverThreaded 
    gcc -D_POSIX_SOURCE -Wall -Werror -pedantic -std=c99 -D_GNU_SOURCE -pthread main.c service_client_socket.c service_listen_socket.c get_listen_socket.c -o server 
    gcc -D_POSIX_SOURCE -Wall -Werror -pedantic -std=c99 -D_GNU_SOURCE -pthread client.c -o client 
    .PHONY: all

【问题讨论】:

  • 这个问题给人的印象是你已经有一个 makefile 来创建一个文件,现在你想改变它,让它创建 3 个文件。现在(编辑后)您似乎根本没有任何makefile!您可能要考虑不使用makefile,而只使用一个shell 脚本来进行编译。或查看here 以获取简单的makefile 示例。
  • @anatolyg 我的作业将从 makefile 中自动编译,因此很遗憾我需要制作一个。我想出了如何使用它来编译一个文件,但这就是我可以开始工作的全部

标签: c gcc makefile


【解决方案1】:

您可以添加一个 phony 规则(即不构建文件本身的规则),该规则具有您想要构建的任何内容作为其先决条件。按照惯例,这条规则在大多数 Makefile 中称为all。对于您的情况,它看起来像这样:

all: serverThreaded server client

这也是很常见的把它作为第一条规则,所以如果你只输入make 没有目标,它会被自动选择。

要做的一件重要的事情是让make知道这条规则实际上是“假的”,方法是将它放在特殊目标.PHONY的先决条件中,如下所示:

.PHONY: all

这是必要的,否则make 会期望它构建一个名为all 的文件。如果您在当前目录中有一个文件 all 比您实际构建的所有文件都新,make 不会做任何事情。


关于编辑,它没有任何意义。用这种问答形式完全解释 make 是不可能的,所以我将举一个例子,作为一个非常基本的 Makefile 的样子,作为开始:

CC:= gcc
CFLAGS:= -D_POSIX_SOURCE -Wall -Werror -pedantic -std=c99 -D_GNU_SOURCE -pthread
LIBS:= -pthread

serverThreaded_OBJS:= main.o service_client_socket.o service_listen_socket.o get_listen_socket.o
server_OBJS:= main.o service_client_socket.o service_listen_socket.o get_listen_socket.o
client_OBJS:= client.o

all: serverThreaded server client

serverThreaded: $(serverThreaded_OBJS)
    $(CC) -o$@ $^ $(LIBS)

server: $(server_OBJS)
    $(CC) -o$@ $^ $(LIBS)

client: $(client_OBJS)
    $(CC) -o$@ $^ $(LIBS)

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

clean:
    rm -f *.o

.PHONY: all clean

顺便说一句,很奇怪您的 serverThreadedserver 是如何使用完全相同的源和完全相同的标志构建的——您最终会得到完全相同的二进制文件。

【讨论】:

  • 我对制作文件的了解很差。那么我的完整makefile会像这样吗? all: serverThreaded server client &lt;tab&gt;gcc -D_POSIX_SOURCE -Wall -Werror -pedantic -std=c99 -D_GNU_SOURCE -pthread main.c service_client_socket.c service_listen_socket.c get_listen_socket.c -o serverThreaded&lt;tab&gt;gcc -D_POSIX_SOURCE -Wall -Werror -pedantic -std=c99 -D_GNU_SOURCE -pthread main.c service_client_socket.c service_listen_socket.c get_listen_socket.c -o server&lt;tab&gt;gcc -D_POSIX_SOURCE -Wall -Werror -pedantic -std=c99 -D_GNU_SOURCE -pthread client.c -o client.PHONY: all
  • @toastedDeli 但我想这是完全错误的。您的 all 规则通常不应该有配方。相反,使用其他三个规则 serverThreadedserverclient,它们具有构建相应二进制文件的配方。你应该更进一步,有一个模式规则%.o: %.c 构建单个目标文件以充分利用make ...请先阅读一些手册/书籍等。
  • 谢谢。是的,作业有 2 个部分;创建单线程服务器和创建多线程服务器。我只是为了节省时间才实现了多线程。
【解决方案2】:

您可以添加一个人工目标作为第一个目标。按照惯例,这个目标通常称为all。然后你可以列出你真正想要构建的所有依赖:

all: serverThreaded server client

this discussion of the default goal

【讨论】:

  • 永远不要忘记将其列为.PHONY
猜你喜欢
  • 2021-12-18
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 2015-01-25
  • 2013-12-13
  • 2021-05-25
  • 2010-12-04
相关资源
最近更新 更多