Gcc 使用Makefile编译时缺少函数main

Gcc 使用Makefile编译时缺少函数main,gcc,makefile,Gcc,Makefile,我试图将源代码编译成二进制 在两个源文件中,main函数定义在一个(main.c)中。但是,在将源代码编译成二进制文件时,仍然会出现以下错误 这是我的Makefile: CC = gcc LD = ld AR = ar NM = nm OBJCOPY = objcopy OBJDUMP = objdump READELF = readelf CFLAGS += -Wall -I. LDADD += -lpthread -ldl -L. -llob

我试图将源代码编译成二进制

在两个源文件中,main函数定义在一个(main.c)中。但是,在将源代码编译成二进制文件时,仍然会出现以下错误

这是我的Makefile:

CC      = gcc
LD      = ld
AR      = ar
NM      = nm
OBJCOPY = objcopy
OBJDUMP = objdump
READELF = readelf


CFLAGS += -Wall   -I.
LDADD +=  -lpthread -ldl -L. -llob

BINARY=test

.PHONY: all
all: $(BINARY)

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

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

$(BINARY): sub.o main.o 
    $(CC) $(CFLAGS) $(LDADD) -o $@ $<  

.PHONY: clean
clean:
    rm -f $(OBJS) $(BINARY)
CC=gcc
LD=LD
AR=AR
纳米=纳米
OBJCOPY=OBJCOPY
OBJDUMP=OBJDUMP
READELF=READELF
CFLAGS+=-Wall-I。
LDADD+=-lpthread-ldl-L.-llob
二进制=测试
冒牌货:全部
全部:$(二进制)
main.o:main.c
$(CC)$(CFLAGS)-c-o$@$<
sub.o:sub.c
$(CC)$(CFLAGS)-c-o$@$<
$(二进制):sub.o main.o
$(CC)$(CFLAGS)$(LDADD)-o$@$<
.假冒:干净
清洁:
rm-f$(OBJS)$(二进制)
这将返回错误:

/usr/lib/gcc/x86_64-linux-gnu/5/./../../../x86_64-linux-gnu/crt1.o:在函数
\u start'中:
(.text+0x20):未定义对
main'的引用 collect2:错误:ld返回了1个退出状态


请告知

错误源于此部分

$(BINARY): sub.o main.o 
    $(CC) $(CFLAGS) $(LDADD) -o $@ $<
其中,
$^
指的是所有预请求站点(感谢@MadScientist指出这一点)。还可以考虑将源文件和对象文件存储在变量中。我建议将编译源代码和链接的规则替换为以下内容

SRC = $(wildcard *.c)
OBJ = $(SRC:%.c=%.o)

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

$(BINARY): $(OBJ)
    $(CC) $(CFLAGS) $(LDADD) -o $@ $(OBJ)
SRC=$(通配符*.c)
OBJ=$(SRC:%.c=%.o)
%.o:%.c
$(CC)$(CFLAGS)-c-o$@$<
$(二进制):$(OBJ)
$(CC)$(CFLAGS)$(LDADD)-o$@$(OBJ)

在这里,当前目录中的所有.c文件都被编译成目标文件,然后链接到可执行文件中(如果您不希望每个.c文件都有一个特定的选择,请调整
通配符
行)。

您可以使用
$^
表示所有先决条件。看见
SRC = $(wildcard *.c)
OBJ = $(SRC:%.c=%.o)

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

$(BINARY): $(OBJ)
    $(CC) $(CFLAGS) $(LDADD) -o $@ $(OBJ)