Sida 1 av 1

Problem med mål och krav i en Makefile

Postat: 22 nov 2007, 08:21
av PureW
Hej, har precis börjat programmera i Linux och har lite problem med mina Makefiles. Man undrar ju varför det inte kan vara som i Windows där det sköter sig självt.

Jag har denna Makefile'n:

Kod: Markera allt

CFLAGS= -Wall -lglfw  -L/usr/X11R6/lib -lGL -lX11 -lm

OBJS = test.o graphics.o

test: test.o graphics.o
	# the order of OBJS and CFLAGS is important
	# See "Link order of libraries": 	            "http://www.network-theory.co.uk/docs/gccintro/gccintro_18.html"
	g++ -o test ${OBJS} ${CFLAGS}

graphics.o: graphics.cpp
	g++ ${CFLAGS} -c graphics.cpp
Vad jag förstått så är graphics.o ett krav för att målet test ska utföras. Dock så utförs ändå test först innan graphics.o skapats. Utskriften blir denna:
$ make
g++    -c -o test.o test.cpp
# the order of OBJS and CFLAGS is important
# See "Link order of libraries": "http://www.network-theory.co.uk/docs/gc ... ro_18.html"
g++ -o test  test.o -Wall -lglfw  -L/usr/X11R6/lib -lGL -lX11 -lm
test.o: In function `main':
test.cpp:(.text+0x96): undefined reference to `initWindow(int, int, int, int, char*)'
collect2: ld returnerade avslutningsstatus 1
make: *** [test] Fel 1
I test.cpp inkluderar jag graphics.h där jag har deklarationen till initWindow( ... )
Definitionen ligger i graphics.cpp som borde kompileras före målet test utförs.

Varför utförs inte graphics.o före test?

Och varför syns mina kommentarer?

(Jag har tagit bort alla gamla .o-filer innan jag kör make)
(Använder Ubuntu 7.10)

SV: Problem med mål och krav i en Makefile

Postat: 22 nov 2007, 10:40
av Lars
Jag får inte riktigt ihop felet med hur din Makefile ser ut. Men problemet är att den försöker bygga test från enbart test.o, och det fungerar ju inte. I GNU Make så finns det en del fördefinierade regler, det är ofta enklast att använda dem. Det här ska fungera:

Kod: Markera allt

CC=g++
CPPFLAGS=-Wall
LDFLAGS=-lglfw -L/usr/X11R6/lib -lGL -lX11 -lm

test: test.o graphics.o

clean:
        $(RM) test *.o
De sista raderna är för att kunna köra "make clean" för att rensa upp och börja om från början, det är alltid smidigt att kunna göra.

Anledningen till att dina kommentarer syns är att de är indenterade, de måste stå först på raden.