[英]How to make a single “makefile” create 3 output binaries
谁能帮我为我的项目创建一个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中都称为all
。 对于您的情况,它看起来像这样:
all: serverThreaded server client
将其作为第一条规则也是很常见的,因此,如果您只键入make
而没有目标,则会自动选择它。
重要的事情是通过将它放在特殊目标.PHONY
的先决条件中, 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
-您最终将得到完全相同的二进制文件。
您可以添加一个人工目标作为第一个目标。 按照惯例,此目标通常称为all
。 然后,您可以列出您实际要构建的所有依赖项:
all: serverThreaded server client
请参阅有关默认目标的讨论 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.