有人可以帮我为我的项目创建一个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
答案 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
作为旁注,奇怪的是,serverThreaded
和server
是如何使用完全相同的标记从完全相同的源构建的 - 您最终会得到完全相同的二进制文件。
答案 1 :(得分:1)
您可以添加人造目标作为第一个。按照惯例,此目标通常称为all
。然后,您可以列出您实际想要构建的所有依赖项:
all: serverThreaded server client