繁体   English   中英

如何制作一个“ makefile”来创建3个输出二进制文件

[英]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

附带说明一下,奇怪的是如何从具有完全相同标志的完全相同的源构建serverThreadedserver -您最终将得到完全相同的二进制文件。

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

all: serverThreaded server client

请参阅有关默认目标的讨论

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM