如何使用makefile编译所有源代码(有些仅用于目标文件)?

时间:2013-05-29 13:09:36

标签: c makefile

我得到一个"未定义的对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)

2 个答案:

答案 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目录中调用它。