1

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

2 回答 2

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您几乎必须将其全部写出来。

于 2013-05-29T13:15:46.683 回答
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 目录调用它。

于 2013-05-29T13:19:11.540 回答