c - 如何使用makefile编译所有源文件(有些仅编译到目标文件)?

标签 c makefile

尝试编译时,我的一个文件出现“未定义的对 main 的引用”错误。我知道这是因为这个文件没有 main 方法。这只是一些辅助方法的实现文件,所以我只想将其编译为目标文件而不是可执行文件。如果我明确告诉 makefile 对每个文件做什么,我就知道如何做到这一点,但我正在尝试编写一个 makefile 来一次编译所有源代码。我尝试使用 -c 标志,但随后它将我的所有文件仅编译为目标文件而不是可执行文件。我到底该怎么做呢? 这是:

CC = gcc
CFLAGS = -g -Wall
SRCS = ./src/server.c ./src/client_slave.c ./src/sockaddrAL.c
EXECS = ./bin/server ./bin/client_slave
OBJS = $(SRCS:.c=.o)

all: clean $(SRCS) server client

server: $(OBJS)
        $(CC) $(CFLAGS) ./src/server.o -o ./bin/server

client: $(OBJS)
        $(CC) $(CFLAGS) ./src/client_slave.o -o ./bin/client_slave

.c.o:
        $(CC) $(CFLAGS) -c $< -o $@

clean:
        @rm -f $(EXECS) $(OBJS)

最佳答案

您应该将 -c 标志添加到构建 .o 文件的规则(您的 .c.o 后缀规则)和不要将其添加到构建可执行文件的规则($(EXECS) 规则)中。

CC = gcc
CFLAGS = -g -Wall
EXECS = ./bin/server ./bin/client_slave

all: $(EXECS)

./bin/%: ./src/%.o ./src/sockaddrAL.o
        $(CC) $(CFLAGS) -o $@ $^

.c.o:
        $(CC) $(CFLAGS) -c $< -o $@

clean:
        @rm -f $(EXECS) $(OBJS)

您在问题中根本没有显示 sockAddrAL,所以我认为它属于两个可执行文件。另请注意,上述语法假定为 GNU make。如果您只想使用 POSIX 标准 make 中提供的功能,您几乎必须将其全部写出来。

关于c - 如何使用makefile编译所有源文件(有些仅编译到目标文件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16814812/

相关文章:

c - 在 C 函数中使用 | 进行查询参数中的运算符

C程序编译但不会打印出main方法中的测试用例

c - 具有相同功能的 C 中的 Makefile 错误

c - 如何通过makefile包含头文件

makefile - Linux中make命令的错误日志

c - 如何用2个线程同时读取/写入文件?

使用函数指针在测试程序中编译错误

c - 关于 printf 中的字符串

c++ - 为什么这个 Makefile 无法构建项目?

C++ 错误 : Multiple definitions of class functions