corey chang
corey chang

Reputation: 11

makefile error: “make: *** No rule to make target …”

I'm trying to use GCC (linux) with a makefile to compile my project. I get the following error

"No rule to make target 'output/src/main.o', needed by 'test'.  Stop."

This is the makefile:

COMPILE_PREX ?= 
CC = $(COMPILE_PREX)gcc

SOURCE = $(wildcard src/*.c)
OBJS = $(addprefix ./output/, $(patsubst %.c, %.o, $(SOURCE)))

INCLUDES = -I ./src
CFLAGS += -O2 -Wall -g
LDFLAGS += -lpthread

TARGET = test

$(TARGET): $(OBJS)
    $(CC) $(OBJS) $(LDFLAGS) -o $(TARGET)

%.o: %.c
    @mkdir -p ./output
    $(CC) $(CFLAGS) $(INCLUDES) -o $(addprefix ./output/, $@) -c $< 

clean:
    rm -rf ./output

Upvotes: 1

Views: 4645

Answers (1)

Jens
Jens

Reputation: 72667

This should work. Note the use of mkdir $(@D) to create output directories as needed.

COMPILE_PREX ?=
CC = $(COMPILE_PREX)gcc

SOURCE = $(wildcard src/*.c)
OBJS = $(addprefix output/, $(patsubst %.c, %.o, $(SOURCE)))

INCLUDES = -I src
CFLAGS += -O2 -Wall -g
LDFLAGS += -lpthread

TARGET = test

$(TARGET): $(OBJS)
    $(CC) $(OBJS) $(LDFLAGS) -o $(TARGET)

output/%.o: %.c
    @mkdir -p $(@D)
    $(CC) $(CFLAGS) $(INCLUDES) -o $@ -c $<

clean:
    rm -rf output

Running it here with make clean test:

rm -rf output
gcc -O2 -Wall -g -I src -o output/src/hello.o -c src/hello.c
gcc output/src/hello.o -lpthread -o test

Upvotes: 1

Related Questions