Jedi_Maseter_Sam
Jedi_Maseter_Sam

Reputation: 813

How to create reference to an .o file in Makefile

I was given two .o files with corresponding .h files to use for an assignment, but I do not know how to get the compiler to use the .o files. This is the Makefile I am currently using:

    TARGET = prog
LIBS = -lm
CC = gcc
CFLAGS = -g -Wall

.PHONY: default all clean

default: $(TARGET)
all: default

OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)

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

.PRECIOUS: $(TARGET) $(OBJECTS)

$(TARGET): $(OBJECTS)
    $(CC) $(OBJECTS) -Wall $(LIBS) -o $@

clean:
    -rm -f *.o
    -rm -f $(TARGET)

I believe I need to add the file1.o and file2.o at the end, but I am not sure if that is right. I do have the .h files in the C source files when appropriate, so the only reason that I can think of for the compilation error is that the .o files are not being compiled with my code.

Upvotes: 2

Views: 1656

Answers (2)

Craig Estey
Craig Estey

Reputation: 33601

Add a define for the provided .o's (e.g.):

PREBUILT_O = fludger.o ramble.o plexor.o

Change your target rule to:

$(TARGET): $(OBJECTS) $(PREBUILT_O)
    $(CC) $(OBJECTS) $(PREBUILT_O) $(LIBS) -o $@

Upvotes: 1

Russ Schultz
Russ Schultz

Reputation: 2689

The compiler doesn't use your .o files. The linker does.

Your link step needs to be

$(TARGET) : $(OBJECTS)
    $(LD) $(OBJECTS) $(LIBS) -o $@

(Very possibly missing some other linker flags, but that's the crux of your problem)

Also, you probably don't want the clean step to delete all the .o files since you're provided with at least two of them.

Upvotes: 1

Related Questions