谁能帮我为我的项目创建一个 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 和服务器)
而且我也需要 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 中称为 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
作为旁注,奇怪的是你的 serverThreaded
和 server
是如何从完全相同的来源和完全相同的标志构建的——你最终会得到完全相同的相同的二进制文件。
关于c - 如何使单个 "makefile"创建 3 个输出二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46910925/