Makefile: Circular dependency

Fórumok

Egy teljesen kezdőnek valaki meg tudná mondani, mi a baja ennek a Makefile-nak?


CC = gcc
CFLAGS += -g -Wall
INSTALL = install
RM = rm
DESTDIR = /
prefix = /usr/local
bindir = $(prefix)/bin
SRCS = main.c

all: malbolge

clean:
        -$(RM) -f *.o malbolge

malbolge: main.c
        $(CC) -o $@ $<

.o.c:
        $(CC) $(CFLAGS) -c $<

Konkrét baj vele az, hogy a make folyamatosan circular dependency miatt sír, de nem bírom észrevenni azt a bizonyos circular dependency-t, ha kinézem a szemem akkor se.

main.c helyett volt már main.o is arra is ugyanez a baj.

Hozzászólások

Ezt:
malbolge: main.c
cseréld erre:
malbolge:
és jó lesz.

Aham.

Kód:


CC = gcc
CFLAGS += -g -Wall
INSTALL = install
RM = rm
# DESTDIR = /
prefix = /usr/local
bindir = $(prefix)/bin
SRCS = main.c

all: malbolge

clean:
        -$(RM) -f *.o malbolge

install: malbolge
        mkdir -p $(DESTDIR)/$(bindir)
        $(INSTALL) -s -m 755 malbolge $(DESTDIR)/$(bindir)

tarball: clean
        mkdir malbolge-0.1
        cp main.c Makefile malbolge-0.1
        tar zcf ../malbolge-0.1.tar.gz malbolge-0.1
        rm -rf malbolge-0.1

malbolge: 
        $(CC) -o $@ $<

.o.c:
        $(CC) $(CFLAGS) -c $<

Üzenet:


gcc -o malbolge 
gcc: no input files
make: *** [malbolge] Error 1

Azaz innentől a main.c nem fordul le. Tudom, hogy valami egyszerűt rontok el... Érzem... De kezdő vagyok a Makefile-ok terén, és talán ezért nem látom meg a lényeget.


malbolge: main.o
        $(CC) -o $@ $<

vagy


malbolge: main.o
        $(CC) -o $@ *.o

vagy


malbolge: main.o
        $(CC) -o $@ main.o

Attól függ mennyire akarod bővíteni.
Én szoktam egy OBJS változót csinálni amiben felsorolom az object file-okat, és azt adom meg dependency-nek.
De ha csak egy c file-od van akkor nem kell a .o.c target, elég egy ilyen:


malbolge: main.c
        $(CC) -o $@ $<

[szerk] ja igen ez ugyanaz mint az eredeti megoldásod :), vedd ki a .o.c targetet [/szerk]

"Azaz innentől a main.c nem fordul le."
A main.c lefordult szerintem main.o-ra, linkelni nem tudott.

Bocs, félreértettem az előbb a problémádat.
Most kipróbáltam én is, és nekem is ugyanaz,

Aztán rájöttem:
.c.o nem pedig .o.c :)
Egyébként a .c.o beépített szabály, így ki se kell írni, elég ha dependency-ként valami.o van akkor rögtön hív egy


$(CC) $(CFLAGS) -c -o $@ $<

jellegű dolgot

egyébként ha szabályos akarsz lenni akkor kell még egy

 .SUFFIXES: .c .o 

sor is

make -r és akkor kihagyja a beépített szabályait

OT
Azért elmagyarázhatnád, hogy fizikailag mi a különbség a
.c.o:
akármi

illetve a
%.o: %.c
akármi

szabályok között. Az első azt mondja, hogy ha a kiterjesztés .c és .o -t akarok csinálni, akkor az kell nekem, hogy 'akármi'. A második meg azt mondja, hogy ha a fájlnév valami.c és valami.o -t akarok csinálni, akkor. Azaz gyakorlatilag ugyan az. És valóban, ez (akármelyik formában is) beépített szabály. /OT