Makefile Aufgabe 7

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Makefile Aufgabe 7
Hi,
bei meinem ersten kompilieren der Aufgabe 7 an meinem Rechner zuhause ist mir aufgefallen, dass das in einer sehr langen Fehlermeldung endet.
Sieht ungefähr so aus

Blatt7$ make A7a
g++  -lGL -lGLU -lglut -lpthread -o bezier objs/beziercurve.o objs/bezierWindow.o objs/glutMaster.o objs/glutWindow.o objs/lagrangecurve.o objs/matrix.o objs/newtoncurve.o objs/point2d.o objs/polycurve.o objs/polyWindow.o objs/bezier.o 
objs/bezierWindow.o: In function `BezierWindow::CallBackReshapeFunc(int, int)':
/Blatt7/bezierWindow.cpp:121: undefined reference to `glMatrixMode'
/Blatt7/bezierWindow.cpp:123: undefined reference to `glLoadIdentity'
/Blatt7/bezierWindow.cpp:124: undefined reference to `glViewport'
/Blatt7/bezierWindow.cpp:125: undefined reference to `glOrtho'
/Blatt7/bezierWindow.cpp:127: undefined reference to `glMatrixMode'
/Blatt7/bezierWindow.cpp:129: undefined reference to `glutPostRedisplay'
objs/bezierWindow.o: In function `BezierWindow::CallBackMotionFunc(int, int)':
/Blatt7/bezierWindow.cpp:161: undefined reference to `glutPostRedisplay'
etc.
etc.
etc.

Nach kurzem Blick in die Makefile zeigte sich warum:

bezier: $(filter-out $(MAINS), $(OBJECTS)) objs/bezier.o
$(CXX) $(LDFLAGS) -o $@ $^

bezierText: $(filter-out $(MAINS), $(OBJ_NOGUI)) objs/bezierText.o
$(CXX) -o $@ $^

poly: $(filter-out $(MAINS), $(OBJECTS)) objs/poly.o
$(CXX) $(LDFLAGS) -o $@ $^

Die LDFLAGS stehen vor der Source-File, das bringt wohl meinen GCC hier durcheinander, falls noch jemand das gleiche Problem zuhause hat, muss er einfach nur die Reihenfolge ändern.
Man kann das bestimmt auch regeln, indem man an irgendwelchen Compiler-Einstellungen rumspielt, aber das funktioniert auf jeden Fall auch:

bezier: $(filter-out $(MAINS), $(OBJECTS)) objs/bezier.o
$(CXX) -o $@ $^ $(LDFLAGS)

bezierText: $(filter-out $(MAINS), $(OBJ_NOGUI)) objs/bezierText.o
$(CXX) -o $@ $^

poly: $(filter-out $(MAINS), $(OBJECTS)) objs/poly.o
$(CXX) -o $@ $^ $(LDFLAGS)


Hm, das Problem gab’s letztes Jahr auch schon. Könnte man mal fixen.

Das liegt übrigens daran, dass der Linker Objectfiles und Libraries in der Reihenfolge abarbeitet, in der sie angegeben sind, siehe auch hier.


Genau, das musste man sogar mal in einer SP-Aufgabe beachten, soweit ich mich erinnern kann :smiley:


Gibts da ueberhaupt einen guten Grund, dass die Regeln da explizit was machen? Eigentlich muesste make das doch mit den internen Regeln ganz gut hinkriegen. Also mal ganz abgesehen davon dass Bibliotheken in den LDFLAGS nichts verloren haben, die gehoeren in die LDLIBS.