谁能帮助我为我的项目创建一个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从具有完全相同的标志完全相同的源建-你最终会具有完全相同的二进制文件.