make: *** 没有规则来创建 s1_c1 需要的目标 s1_c1.o

问题描述 投票:0回答:1

我是新手,我正在尝试一次构建多个二进制文件,这些二进制文件都依赖于相同的对象。我的 makefile 看起来像这样:

BINARY=s1_c1 s1_c2 s1_c3

CODEDIRS=./challenges ./src 

INCDIRS=. ./include/

COMPILER=gcc
OPT=-O2 
DEBUG=-Og 

DEPFLAGS=-MP -MD

CFLAGS1=-Wall -g $(foreach D, $(INCDIRS), -I$(D)) $(DEBUG) $(DEPFLAGS)
CFLAGS2=-Wall $(foreach D, $(INCDIRS), -I$(D)) $(DEPFLAGS)

CFILES=$(foreach D, $(CODEDIRS), $(wildcard $(D)/*.c))
MAINCFILES = $(foreach V, $(CFILES), $(if $(filter ./challenges/% , $V),$V))

OBJECTS = $(patsubst %.c,%.o,$(CFILES))

MAINOBJECTS = $(foreach V, $(OBJECTS), $(if $(filter ./challenges/% , $V),$V))
LIBOBJECTS = $(foreach V, $(OBJECTS), $(if $(filter ./src/% , $V),$V))

DEPFILES = $(patsubst %.c,%.d,$(CFILES))

all : $(BINARY)

.PHONY: all


s1_c1 : $(LIBOBJECTS) s1_c1.o
    $(COMPILER) (-o) $@ $^

s1_c2 : $(LIBOBJECTS) s1_c2.o
    $(COMPILER) (-o) $@ $^

s1_c3 : $(LIBOBJECTS) s1_c3.o
    $(COMPILER) (-o) $@ $^

%.o : %.c
    $(COMPILER) $(CFLAGS1) -c -o $@ $^

clean:
    rm -rf $(BINARY) $(LIBOBJECTS) $(DEPFILES)

包含主要功能的 s1_c* 源文件位于名为 ./challenges 的目录中,其他文件位于 ./src 目录中。 ./include 包含./src 的.h。二进制文件应该构建在另一个名为 bin 的目录中。每个目录都位于包含 makefile 的主目录中。当我运行 make 时,我收到标题中的错误。我猜这个问题来自于我对自动变量和模式规则的误解,但我无法通过 gnu 文档得到正确的结果。预先感谢您!

c makefile
1个回答
0
投票

正如其他人在评论中所说,您需要添加目录名称以告诉 make 在哪里可以找到这些 .o 文件。 与模式规则相结合,您的 makefile 会短得多。

    BINARY=s1_c1 s1_c2 s1_c3 
    
    CODEDIRS=./challenges ./src 
    
    INCDIRS=. ./include/
    
    COMPILER=gcc
    OPT=-O2 
    DEBUG=-Og 
    
    DEPFLAGS=-MP -MD
    
    CFLAGS1=-Wall -g $(foreach D, $(INCDIRS), -I$(D)) $(DEBUG) $(DEPFLAGS)
    CFLAGS2=-Wall $(foreach D, $(INCDIRS), -I$(D)) $(DEPFLAGS)
    
    CFILES=$(foreach D, $(CODEDIRS), $(wildcard $(D)/*.c))
    
    OBJECTS = $(patsubst %.c,%.o,$(CFILES))
    
    LIBOBJECTS = $(foreach V, $(OBJECTS), $(if $(filter ./src/% , $V),$V))
    
    DEPFILES = $(patsubst %.c,%.d,$(CFILES))
    
    all : $(BINARY)
    
    .PHONY: all
    
    $(BINARY): %: $(LIBOBJECTS) challenges/%.o 
        $(COMPILER)  -o $@ $^
    
    %.o : %.c
        $(COMPILER) $(CFLAGS1) -c -o $@ $^
    
    clean:
        rm -rf $(BINARY) $(LIBOBJECTS) $(DEPFILES)
© www.soinside.com 2019 - 2024. All rights reserved.