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

toa*_*eli 0 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
Run Code Online (Sandbox Code Playgroud)

小智 5

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

all: serverThreaded server client
Run Code Online (Sandbox Code Playgroud)

将此作为第一个规则也很常见,因此如果您只是在make没有目标的情况下键入,则会自动选择它.

一件重要的事情就是通过把它放在特殊目标的先决条件中来让make这个规则实际上 "假的",.PHONY如下所示:

.PHONY: all
Run Code Online (Sandbox Code Playgroud)

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


关于编辑,它没有任何意义.make在这个Q&A格式中完全解释是不可能的,所以我只是给你一个例子,一个非常基本的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
Run Code Online (Sandbox Code Playgroud)

作为一个侧面说明,这是不可思议的你serverThreaded,并server从具有完全相同的标志完全相同的源建-你最终会具有完全相同的二进制文件.