我得到一个"未定义的对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)
答案 0 :(得分:3)
您应该将-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
中提供的功能,那么您几乎必须全力以赴。
答案 1 :(得分:1)
让隐含的规则成为你的朋友。你的整个Makfefile应该是:
CC = clang
CFLAGS = -O0 -g -Wall
SRCS = server.c client_slave.c sockaddrAL.c
OBJS = $(SRCS:.c=.o)
EXECS = server
server: $(OBJS)
clean:
@rm -f $(EXECS) $(OBJS)
从src目录中调用它。