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

标签 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 和服务器)

而且我也需要 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,它会自动被选中。

一件重要的事情是让 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 是如何从完全相同的来源和完全相同的标志构建的——你最终会得到完全相同的相同的二进制文件。

关于c - 如何使单个 "makefile"创建 3 个输出二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46910925/

相关文章:

c - Win32 在当前控制台执行子进程并退出而不返回父进程

c - 常用的libc头文件有哪些及其功能

python - fatal error : Python. h:没有这样的文件或目录

android - 从源代码 : make: no rule to make target *. 构建 CyanogenMod,*.so 需要

c++ - 无法在 Windows 7 中执行 makefile

c - 没有参数类型的函数指针?

c - 这可以用 printf 实现吗?

javascript - 如何在 ASP 经典 JavaScript 中使用 C 代码

c++ - 奇怪的 GCC 行为

c++ - 如何从 CodeBlocks 或 Makefile 强制包含 header ?