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.
- 1213 megtekintés
Hozzászólások
Ezt:
malbolge: main.c
cseréld erre:
malbolge:
és jó lesz.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Nem fordult le, mert előtte nyomtam egy make clean-t.
Gondoltam én is erre a megoldásra, csak szerettem volna tudni, hogy ez a .c.o hogyan műköszik.
Végülis ilyet is csinálhatok:
malbolge: main.o
$(CC) -o $@ $<
main.o:
$(CC) -c main.c
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
szerintem .c.o helyett "pattern"-eket használj. pl így:
%.o: %.c
$(CC) -o $@ $<
de ezt implicit szabályban úgyis tudja a make. info make. nagyon jól le van írva ott mindez.
---
Reactor error - core dumped!
- A hozzászóláshoz be kell jelentkezni
Aham. Kár hogy a man oldal nem olyan részletes (bár sok tekintetben az). Nekem az a bajom az info-val hogy kissé nehézkes benne a mozgás, de majd kitalálok valamit.
- A hozzászóláshoz be kell jelentkezni
Az "info kényelmetlen" problémára én a pinfo programot tudom javasolni :-)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
a patternes átláthatóbb. de nem .o-t akarok .c-ből. ha .o-t akarok csinálni, kell hozzá ez a .c.
info olvasni gnome/kde helpnéző is jó, ha olyat használnál desktopnak.
---
Reactor error - core dumped!
- A hozzászóláshoz be kell jelentkezni