两次编译文件

时间:2020-11-06 04:23:15

标签: makefile gnu-make

我的.c和.o文件位于不同的目录中。 我的make文件看起来像这样

CC = cc
SRCDIR = src
OBJDIR = bin
TARGET = main # output binary
# do not edit below this line
SOURCES = $(shell find $(SRCDIR) -type f -name *.c)
OBJECTS = $(patsubst $(SRCDIR)/%,$(OBJDIR)/%,$(SOURCES:.c=.o))
#Flags, Libraries
CFLAGS      := -I. -c 
LIB         := 

all: $(OBJECTS)
    $(CC) $(OBJECTS) -o $(TARGET)

$(OBJECTS):$(SOURCES)
    $(CC) $(CFLAGS) $< $(LIB) -o $@

.PHONY : clean

clean:
    rm bin/*
    rm main

但是当我运行它时。它以某种方式设法两次编译文件。

make
cc -I. -c  src/somefile.c  -o bin/somefile.o
cc -I. -c  src/somefile.c  -o bin/main.o
cc bin/somefile.o bin/main.o -o main 
/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/10/../../../../lib64/crt1.o: in function `_start':
(.text+0x24): undefined reference to `main'
collect2: error: ld returned 1 exit status

1 个答案:

答案 0 :(得分:0)

您的$(OBJECTS)配方实际上是在要求它编译$<中的第一个文件$(SOURCES)

可能只是删除这些食谱; make已经完全知道如何正确编译C文件。