Projektspezifisches Makefile



  • Hey!

    Ich bekomme es einfach nicht hin, ein makefile für ein simples Programm zu erstellen. Hier was ich habe:

    • main.cpp // Inkludiert MainWindow.h
    • MainWindow.h // Inkludiert ui_MainWindow.h
    • MainWindow.cpp
    • ui_MainWindow.h

    Diese Dateien inkludieren nur QT4-Header bzw. benötigt z.B. folgende Lib:
    qtmain.lib

    Include-Pfad
    file:/usr/local/Trolltech/Qt-4.1.0/include

    Lib-Pfad
    file:/usr/local/Trolltech/Qt-4.1.0/lib

    Wie muss das Makefile aussehen? Unter Windows hab ich meine IDE, wo ich dann einfach die Dateien integriere und die Pfade zu den entsprechenden Ordnern setze, und es geht.
    Ich komm damit gar nicht klar 😮 😕 😕



  • wenn du unter linux/make bist

    name: dependency
        g++ -c app.cpp
    

    beachte das tab in der 2. zeile. generell werden die c/cpp files die nicht als executable gemacht werden sollen mit -c kompiliert, und dann beim binary mit angehängt:

    dep1:
        g++ -c dep1.cpp
    main: dep1
        g++ -o mainapp mainapp.cpp dep1.o
    

    aufgerufen mit einem

    $ make main
    

    kompiliert es erst die dep1 und dann baut es die mainapp



  • Bei QT kannst du auch qmake verwenden, das erstellt die Makefiles.



  • Ok, ich hab es jetzt ernsthaft versucht und bin kläglich gescheitert.
    Ich habe mir sogar "GNU Make" ausgedruckt (mit gmake will ich das nicht machen). "Gnu Make" finde ich echt schlecht gemacht, dass ist fast wie microsoft.com. Per google.de finde ich schneller den Downloadlink zum DirectX-SDK als über ms.com. So komme ich mir auch gerade bei "Gnu Make" vor.

    Ist jemand so nett und tippt mir das Makefile eben zusammen? Ich weiß, dass klingt so nach Hausaufgaben machen lassen, aber ich bekomme das nicht hin. Das Makefile könnte ich dann studieren.

    Ein paar Sachen habe ich ja mittlerweile begriffen, aber meine Makefiles sind immer fehlerhaft 😉 Hier mal einer meiner missratenen Versuche:

    # Wie gebe ich die Libs/Header(verzeichnisse) an?!
    OUTDIR=Debug
    
    OBJECTS=$(OUTDIR)/MainWindow.o
    	$(OUTDIR)/main.o
    	$(OUTDIR)/ui_MainWindow.o
    
    app : $(OBJECTS)
    	gcc -o app $(OBJECTS)
    
    main.o :
    	gcc -c main.cpp
    
    MainWindow.o : MainWindow.h MainWindow.cpp
    	gcc -c MainWindow.cpp
    
    ui_MainWindow.o : ui_MainWindow.h
    	gcc -c ui_MainWindow.h	
    
    clean :
    	rm MainWindow $(OBJECTS)
    

    Ergebnis

    Makefile:4: *** commands commence before first target. Stop.

    Hier nocheinmal der Aufbau des Programms:

    • main.cpp // Inkludiert MainWindow.h
    • MainWindow.h // Inkludiert ui_MainWindow.h
    • MainWindow.cpp
    • ui_MainWindow.h

    Diese Dateien inkludieren nur QT4-Header bzw. benötigt z.B. folgende Lib:
    qtmain.lib

    Include-Pfad
    file:/usr/local/Trolltech/Qt-4.1.0/include

    Lib-Pfad
    file:/usr/local/Trolltech/Qt-4.1.0/lib

    Wäre echt toll, wenn mir da jemand helfen würde.



  • Benutz doch qmake.

    Pfade fürs linken etc kannst du doch angeben wie und wo du willst. Üblich ist LIBS für libraries oder LDFLAGS generell für Linkerflags und CFLAGS bzw. CXXFLAGS für Compiler-Optionen.

    Der Fehler kommt vermutlich daher, da die Zeilen mit OUTDIR in extra Zeilen stehen und nicht in einer Zeile mit der Variablendeklaration.



  • Hallo,

    hier was zum kopieren.
    Zum einen ne Makefile die ich immer nehme, dann meine ultimake qmake File, die dir per Parameter ein anderes Target baut.
    Zu deinem Makeproblem: Make ist sehr empfindlich gegen Whitespaces, die Einrückung muss einen Tab groß sein, und andere WS dürfen da nicht stehen.

    # Makefile, Einrückung jeweils 1 Tab breit muss wohl korrigiert werden. Danke Forum.
    CXXFLAGS = -g -Wall `fltk-config --cxxflags`
    CXX = g++
    LIBS = `fltk-config --ldflags` -lpthread
    BASEDIR = sourcecode/
    TARGET = $(BASEDIR)out.exec
    SOURCES = $(BASEDIR)common/types.cpp $(BASEDIR)common/thread.cpp $(BASEDIR)common/platform.cpp [..]
    EXT = cpp
    OBJECTS =$(patsubst %.$(EXT),%.o,$(SOURCES))
    DEPS =$(patsubst %.$(EXT),%.dep,$(SOURCES))
    
    $(TARGET): $(OBJECTS) $(DEPS)
            $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS)
    
    #       -include $(DEPS)
    
    %.o: %.$(EXT)
            $(CXX) $(CXXFLAGS) -c $< -o $@
    
    %.dep: %.$(EXT)
            $(CXX) $(CXXFLAGS) -MM $< -MT $(<:.$(EXT)=.o) > $@
    
    .PHONY: clean
    clean:
            rm -f $(TARGET) $(OBJECTS) $(DEPS)
    
    # qmake Datei in einem Verzeichnis überhalb des Sourcecodes.
    TEMPLATE = app
    DESTDIR  = ../binary
    
    # Where to look for sourcecode files (HEADERS and SOURCES)
    SRC = ../sourcecode/
    
    FORMS        += ../resources/forms/designer/mainwindow.ui
    RESOURCES    += ../resources/forms/designer/mainwindow.qrc
    TRANSLATIONS += ../languages/baja_en.ts
    
    # Build target for unit tests
    tests {
            message (Building unittests)
    
            CONFIG += qtestlib
    
            HEADERS +=   $${SRC}tests/exampletest.hpp \
                                    $${SRC}application/headlessapplication.hpp
            SOURCES +=   $${SRC}tests/exampletest.cpp \
                                    $${SRC}application/headlessapplication.cpp
            TARGET = unittests
    
    }
    # Regular build
    !tests {
            message (Normal build)
    
            HEADERS +=  $${SRC}main.hpp \
                                    $${SRC}application/guiapplication.hpp
            SOURCES +=  $${SRC}main.cpp \
                                    $${SRC}application/guiapplication.cpp
    }
    
    # Common files to all buildtargets
    HEADERS += $${SRC}common/logging/log4cxx.hpp \
                            $${SRC}view/mainwindow/mainwindow.hpp [..]
    SOURCE +=  $${SRC}common/logging/log4cxx.cpp \
                            $${SRC}view/mainwindow/mainwindow.cpp [..]
    
    LIBS += -llog4cxx
    
    DEFINES += QT_DLL
    CONFIG  += qt warn_on debug
    


  • @kingruedi: Von Dir ist doch die "ultimate makefile" in der FAQ, oder nicht?! Die tut's doch! 👍



  • Sgt. Nukem schrieb:

    @kingruedi: Von Dir ist doch die "ultimate makefile" in der FAQ, oder nicht?! Die tut's doch! 👍

    hehe, schon fast vergessen. Aber die ist übrigens von volkard und denis (aka DrGreenthumb).

    Also geh und lies die FAQ! 🙂


Anmelden zum Antworten