尝试编译时,我的一个文件出现“未定义的对 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/