[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ührt make den Befehl zuvor selbst aus.)


Anmelden zum Antworten