【问题标题】:Make compiling a file two times两次编译一个文件
【发布时间】:2020-11-06 04:23:15
【问题描述】:

我的 .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

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    模式规则需要修复:

    all: $(TARGET)
    
    $(TARGET): $(OBJECTS)
        $(CC) -o $@ $^ $(LIB)
    
    $(OBJDIR)/%.o : $(SRCDIR)/%.c | $(OBJDIR)
        $(CC) -o $@ -c $(CFLAGS) $<
    
    $(OBJDIR) :
        mkdir -p $@
    
    .PHONY : all 
    

    你还需要automatic dependency generation

    【讨论】:

      【解决方案2】:

      您的$(OBJECTS) 配方实际上是要求它编译$&lt;,这是$(SOURCES) 中的第一个文件。

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

      【讨论】:

        猜你喜欢
        • 2018-11-13
        • 1970-01-01
        • 2011-09-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-21
        • 1970-01-01
        相关资源
        最近更新 更多