如何制作单个" makefile"创建3个输出二进制文件

时间:2017-10-24 12:42:38

标签: c gcc makefile

有人可以帮我为我的项目创建一个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

2 个答案:

答案 0 :(得分:5)

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

all: serverThreaded server client

将此作为非常第一的规则也很常见,因此如果您只键入make而没有目标,则会自动选择它。

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

.PHONY: all

这是必要的,否则,make会期望它构建一个名为all的文件。如果您当前目录中的文件all比实际构建的所有文件都新,make将无法执行任何操作。

关于编辑,它没有任何意义。在此Q&amp; A格式中无法完全解释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是如何使用完全相同的标记从完全相同的源构建的 - 您最终会得到完全相同的二进制文件。

答案 1 :(得分:1)

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

all: serverThreaded server client

请参阅this discussion of the default goal