[gelöst] GTKmm 2.4 und pkg-config + Makefile
-
Hallo,
ich habe für ein Projekt ein Makefile geschrieben, dass funktionierte. Auch mit SDL_Net. Aber als ich die GUI mit Gtkmm impletieren wollte stieß ich auf folgendes Problem:
Durch das Makefile wird pkg-config nicht aufgerufen, was zur Folge hat das der Compiler meint er kann die Include-Datei nicht finden.Gtkmm ist nicht fehlerhaft installiert denn wenn ich die Zeilen die das Makefile automatisch erstellen soll per Hand kompiliere funktioniert alles. Das Problem besteht also zwischen Makefile und pkg-config.
CC=/usr/bin/g++ CFLAGS=-Wall -g $(pkg-config --cflags gtkmm-2.4) LDFLAGS=$(sdl-config --libs --cflags) -lSDL_net $(pkg-config --libs gtkmm-2.4) BIN=schafkopf SRC=./src/ OBJ=./src/schafkopf.o ./src/userinterface ./src/karte.o ./src/person.o ./src/net.o ./src/spieltisch.o ./src/handler.o $(BIN): $(OBJ) $(CC) $(CFLAGS) -o $(BIN) $(OBJ) $(LDFLAGS) %.o: %.c $(CC) $(CFLAGS) -c $< .PHONY: clean clean: rm -rf $(BIN) $(OBJ)
Ich sitze jetzt schon mehrere Stunden vor den Problem und habe versucht zu googlen ohne Ergebnisse zu bekommen.
Es würde mir vielleicht auch schon reichen wenn jemand sein funktionierndes Makefile schickt.
-
Der Aufruf muss:
$(shell pkg-config --cflags gtkmm-2.4)
bzw.
$(shell pkg-config --libs gtkmm-2.4)
lauten.
Damit funktioniert das ganze aber auch noch nicht. Aus irgend einem Grund scheint die Variable
CFLAGS
belegt zu sein. Wenn ein anderere Variablen-Name benutzt wird, scheints zu gehen.
-
Es funktioniert leider immer noch nicht
Egal welchen Variablennamen ich wähle ...
Das Makefile:CC=/usr/bin/g++ CC_FLAG=$(shell pkg-config --cflags gtkmm-2.4) -g -Wall LD_FLAG=$(shell pkg-config --libs gtkmm-2.4) $(sdl-config --libs --cflags) -lSDL_net BIN=schafkopf SRC=./src/ OBJ=./src/schafkopf.o ./src/userinterface ./src/karte.o ./src/person.o ./src/net.o ./src/spieltisch.o ./src/handler.o $(BIN): $(OBJ) $(CC) $(CC_FLAG) -o $(BIN) $(OBJ) $(LD_FLAG) %.o: %.c $(CC) $(CC_FLAG) -c $< .PHONY: clean clean: rm -rf $(BIN) $(OBJ)
Die Fehlermeldung:
g++ -c -o src/schafkopf.o src/schafkopf.cpp In file included from src/schafkopf.cpp:21: src/userinterface.h:3:19: error: gtkmm.h: Datei oder Verzeichnis nicht gefunden In file included from src/schafkopf.cpp:21: src/userinterface.h:8: error: ‘Gtk’ has not been declared src/userinterface.h:8: error: expected `{' before ‘Window’ src/userinterface.h:8: error: function definition does not declare parameters src/schafkopf.cpp: In function ‘int main(int, char**)’: src/schafkopf.cpp:24: error: ‘Gtk’ has not been declared src/schafkopf.cpp:24: error: expected `;' before ‘main’ src/schafkopf.cpp:25: error: aggregate ‘userinterface window’ has incomplete type and cannot be defined src/schafkopf.cpp:26: error: request for member ‘run’ in ‘main’, which is of non-class type ‘int ()(int, char**)’ make: *** [src/schafkopf.o] Fehler 1
Wie schon oben beschrieben ist die gtkmm.h aber existent, da ich manuell ohne Makefile kompilieren kann ...
-
Ich hab folgendes vor den rm eingefügt:
echo $(CC_FLAG) >> test.txt
Nach dem ausführen von make clean sind im File test.txt die Flags richtig enthalten
-D_REENTRANT -I/usr/include/gtkmm-2.4 -I/usr/lib/gtkmm-2.4/include -I/usr/include/glibmm-2.4 -I/usr/lib/glibmm-2.4/include -I/usr/include/gdkmm-2.4 -I/usr/lib/gdkmm-2.4/include -I/usr/include/pangomm-1.4 -I/usr/include/atkmm-1.6 -I/usr/include/gtk-2.0 -I/usr/include/sigc++-2.0 -I/usr/lib/sigc++-2.0/include -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include -I/usr/lib/gtk-2.0/include -I/usr/include/cairomm-1.0 -I/usr/include/pango-1.0 -I/usr/include/cairo -I/usr/include/freetype2 -I/usr/include/directfb -I/usr/include/libpng12 -I/usr/include/pixman-1 -I/usr/include/atk-1.0 -g -Wall
Kann es sein das Makefile die Prozesse mit "falschen" Zugriffsrechten ausführt?
-
Ich hab gerade endlich die Lösung gefunden!
Diese Zeile war fehlerhaft:%.o: %.c
Meine Quelldaten enden auf *.cpp
Verbessert muss es so heißen:%.o: %.cpp
//-------------------------------------------------------------------------------------------
Und ich habe 2 Möglichkeiten ausprobiert in den Zeilen der CFLAGS:-g -Wall $(shell pkg-config --cflags gtkmm-2.4)
und
-g -Wall `pkg-config --cflags gtkmm-2.4`
Meine Frage: Welche Variante ist besser/schöner? Denn beide funktionieren.
PS: Mir ist klar das ihr den Fehler nicht finden konntet -.-
Ich bin bloß froh, dass ich jetzt endlich meine starren Bash-Skripte nicht mehr nutzen muss, die immer alles kompilierten
-
Die Variante mit
$(shell ...)
ist besser, da sie auch unter Windows funktioniert. (Bei Verwendung der ``` wird die ganze Befehlszeile (also der Copmiler- oder Linker-Aufruf) direkt an die Shell weitergegeben - das erkennt die Windows-Shell nicht als Substitution-Befehl; wenn Du $(shell ... ) verwendest führtmake
den Befehl zuvor selbst aus.)