1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

Makefile erstellen

Discussion in 'Programmieren' started by TheMars, May 27, 2009.

Thread Status:
Not open for further replies.
  1. TheMars

    TheMars Byte

    Hallo liebe Community,

    Ich habe einige Verständnisschwierigkeiten beim Umgang mit Makefiles. Ich hänge da schon seit zewi Tagen fest und komme einfach nicht weiter. :confused:

    Das Makefile gibt dem Compiler zusätzliche Anweisungen darüber, wie er mein Projekt kompilieren soll. Bisher habe ich nie eines angegeben, also wurde es immer automatisch erstellt.

    Nun installiert sich z.B. SDL ja sehr schön via Dev-Pack von selbst, linken und fertig. Wenn ich jetzt aber zB. Open Dynamics Engine heruterlade, so stehe ich vor lauter Readme's und Forenbeiträgen über das Erstellen von Makefiles. An der Stelle ist "zusätzliche Anweisungen" etwas zu ungenau, um zu verstehen was ich jetzt warum machen muss und wo genau ich das meiner Entwicklungsumgebung beibringen darf. :(

    Hat evt. jemand ein gutes Tutorial oder kann mir kurz erläutern, welche grundlegenden Schritte ich nun warum abarbeiten muss?

    Danke im Vorraus

    Umgebung: Dev-C++
    Platform: Windows NT 5.1 (XP)
     
  2. daboom

    daboom Megabyte

    Naja grundsätzlich könntest Du ja auch ohne Makefile bauen. Einfach den Compileraufruf + unzählige Parameter (Includes, Eingabedateien, Ausgabedateien usw.) jedesmal auf die Konsole hacken. In erster Linie soll ein Makefile Dir ja diese Arbeit abnehmen.

    Was genau möchtest Du eigentlich machen und wieviel weißt Du schon über Make?

    Hier findest Du das Manual zum GNU Make:

    http://www.gnu.org/software/make/manual/make.html
     
  3. TheMars

    TheMars Byte

    Über Make weiß ich noch garnichts. Ich möchte die Open Dynamics Engine (ODE -> http://www.ode.org/) zum "laufen bringen". Allerdings werd ich aus dem gedownloadeten Content nicht so wirklich schlau -> Linker Error ohne Ende beim Beispielcode. :(

    Im Netz gibts einige Anleitungen (auch von ODE direkt -> http://opende.sourceforge.net/wiki/index.php/Manual_(Install_and_Use)), die ich aber nicht zu interpretieren fähig bin...

    ...naja, das Manual ist jetzt ein bisschen übertrieben lang für mein Problem (vllt. gibts da etwas spezielleres) - mal schauen was ich da rauslesen kann
     
  4. daboom

    daboom Megabyte

    Ok, ich hab mir den Kram mal geladen und angeguckt. Das Ding enthält noch gar kein richtiges Makefile sondern nur solche .in und .am Teile. Die Übertsteigen leider auch mein Verständnis.

    Wie kommst Du überhaupt dahin, dass Du Linker Fehler kriegst?

    Ich hab im build Verzeichnis premake4 ausgeführt und für GCC ein Makefile erstellt. Das erstellt dann einen Unterordner gmake und schmeißt die Makefiles dorthin. Wenn ich dann dort make aufrufe, beendet er irgendwann mit dem Fehler, dass er ein Object-File nicht finden kann, das er eigentlich gerade kompiliert... Sehr komisch.
     
  5. TheMars

    TheMars Byte

    Klasse, Danke! :jump:

    Ich habe die ODE-Dateien (Ordner "ode" und "drawstuff") in den "Include"-Ordner von Dev-C++ (C:\Programme\Dev-Cpp\include) geschoben und dann einfach in einem neuen Projekt mit #include <ode/ode.h> und <drawstuff/drawstuff.h> inkludiert.

    Wenn ich premake4 mit -gmake aufrufe, erhalte ich den Ordner mit "Makefile" und "ode.make" -> das hat funktioniert :spitze:

    Die schiebe ich in mein Projektverzeichniss (?)

    An der Stelle setze ich bei "Projektoptionen>Makedatei>Nutze eigenes Makefile (kein Makefile generieren)" einen Haken und verweise darunter auf die "Makefile"-Datei in meinem Projektordner. Das erzeugt den Fehler:

    *** No rule to make target `../../ode/src/joints/amotor.cpp', needed by `obj/DebugSingleDLL/amotor.o'. Stop.

    Soweit hab ich jetzt mal probiert.
     
  6. daboom

    daboom Megabyte

    Die include Dateien von ODE nicht in das DevC++ include Verzeichnis verschieben! Dort sollten nur die Basis Includes sein, also die, die schon dabei waren.

    Versuch stattdessen, alles vom ODE in das Projektverzeichnis zu kopieren. Das Makefile muss auch unter build/gmake bleiben, da sich die Pfade darauf beziehen. Versuch also, das Makefile von dort aus zu benutzen.
     
  7. TheMars

    TheMars Byte

    Okay, das habe ich jetzt mal gemacht, leider mit dem selben Ergebnis - vielleicht existiert da ein ganz grunds&#228;tzlicher Verst&#228;ndnisfehler. :o

    Also, ich lade ODE herunter, entpacke den "ode-0.11.1"-Ordner

    dann verschiebe ich ihn in mein Projektverzeichniss
    (zB. C:\ODE01)

    nun f&#252;hre ich &#252;ber cmd die premake.exe mit "gmake" als Parameter aus
    Code:
    C:\ODE01\ode-0.11.1\build>premake4.exe gmake
    Building configurations...
    Running action 'gmake'...
    Generating gmake/Makefile...
    Generating gmake/ode.make...
    Done.
    jetzt lasse ich mein Projekt testweise gleich in main.cpp die beiden ODE-Teile (ODE und drawstuff) inkludieren
    Code:
    #include "C:/ODE01/ode-0.11.1/include/ode/ode.h"
    #include "C:/ODE01/ode-0.11.1/include/drawstuff/drawstuff.h"
    an dieser Stelle f&#252;ge ich unter
    "Projektoptionen>Verzeichnisse>Include Verzeichnisse"​
    das Verzeichnis
    C:\ODE01\ode-0.11.1\include​
    hinzu und setze unter
    "Projektoptionen>Makedatei>Nutze eigenes Makefile (kein Makefile generieren)"​
    einen Haken, worauf ich dann darunter mit
    ode-0.11.1\build\gmake\Makefile​
    verlinke.

    soweit finde ich alles ganz logisch :)

    Kompilieren -> erster Fehler
    C:\ODE01\make.exe[1] ode.make: No such file or directory.

    Ich kopiere also
    C:\ODE01\ode-0.11.1\build\gmake\ode.make​
    nach
    C:\ODE01​
    dann erhalte ich den Fehler

    *** No rule to make target `../../ode/src/joints/amotor.cpp', needed by `obj/DebugSingleDLL/amotor.o'. Stop.

    :huh:

    Ist diese Verfahrensweise so &#252;berhaupt zul&#228;ssig?
     
  8. daboom

    daboom Megabyte

    Dass Du das include Verzeichnis angibst, ist ok, da Du die includes ja in Deiner main usw. brauchst. Um ODE an sich zu kompilieren, sollte das aber nicht n&#246;tig sein, da die hierf&#252;r ja im Makefile definiert sind.

    Dieser Fehler ist klar, da die Verzeichnisse, die im Makefile definiert sind, sich darauf beziehen, dass das Makefile wirklich unter /build/gmake liegt. Darum steht dort "../.. usw.", d.h. er will zwei Verzeichnisebenen nach oben (n&#228;mlich genau "/build/gmake"), womit er dann wieder im root Verzeichnis von ODE ist. Darum muss das Makefile in dem Ordner bleiben.

    Das ist komisch. Hei&#223;t entweder, er findet "make.exe" nicht. Die sollte aber durch Deine "PATH" Umgebungsvariable erreichbar sein (also irgendwas unter "DevC++/bin" oder so). Andererseits k&#246;nnte es hei&#223;en, dass er das Makefile unter "C:\ODE01" erwartet, was dem aber widerspricht, dass Du das richtige Makefile verlinkt hast.

    Bis jetzt habe ich das nur mit eclipse CDT in Verbindung mit MinGW probiert, da kam der oben genannt Fehler bei heraus. Ich werde es mal mit Dev-C++ probieren und meld mich dann wieder...
     
    Last edited: May 31, 2009
  9. daboom

    daboom Megabyte

    Gut, ich hab's jetzt mit Dev-C++ so hingekriegt, dass ich den gleichen Fehler erhalte, wie ich oben geschrieben hab ;)

    Folgende Vorgehensweise:

    1. In Dev-C++ ein neues Projekt erstellen
    2. Alles aus dem ode Ordner (also der, der "build", "drawstuff" usw. enthält) in diesen Projektordner kopieren
    3. Im Projektordner eine Main.cpp mit leerer main-Methode anlegen (spielt eigentlich erstmal keine Rolle aber sonst meckert Dev-C++)
    4. Das "include" Verzeichnis von ode den Projekt-Includes hinzufügen (dürfte eigentlich auch erstmal keine Rolle spielen)
    5. Das Makefile (aus dem Anhang dieses Posts) in das Projektverzeichnis kopieren
    6. Dev-C++ auf dieses Makefile verlinken
    7. Kompilieren...

    Was das Makefile macht:
    - per premake ein Makefile für den GCC erstellen (wie wir ja schon diskutiert haben)
    - dieses dann ausführen

    Das wichtige dabei ist, dass der Pfadkontext beim Ausführen des generierten Makefiles wechselt. Das ist wichtig da ja, wie ich schon geschrieben hab, dieses generierte Makefile erwartet, dass es in "build/gmake" liegt.

    Wie man den Fehler, der jetzt auftritt, beheben soll, weiß ich allerdings nicht. Wie gesagt, offensichtlich benötigt er die kompilierte Datei (in diesem Fall "fastdot.o") bevor er die zugehörige Quelldatei (also fastdot.c) kompiliert. Das ist natürlich völlig unsinnig. Die einzige Erklärung wäre wohl, dass die Entwickler hier Mist gebaut haben...

    Edit: Ok, das Problem ist, dass er einen Compiler names "cc" aufrufen will, den es aber bei mir nicht gibt. Jab sowieso vergessen, das Makefile anzuhängen. Habe also überarbeitet und bei mir baut er jetzt die library durch. Guck's Dir mal an und spiel ein bischen. Wenn Du die library dann beutzen möchtest, meld Dich und wir schauen uns das weiter an ;)

    Nimm bitte das ".txt" wieder weg (sieht ja total hässlich aus ;)), PCWelt erlaubt mir nicht, die Datei ohne Endung hochzuladen...
     

    Attached Files:

    Last edited: May 31, 2009
  10. TheMars

    TheMars Byte

    C:\ODE01\Makefile [Build Error] No rule to make target `clean'. Stop.

    ...damit beschäftige ich mich mal die Nacht über, Makefiles sind jetzt wesentlich interessanter geworden ;)

    Danke für die schnelle und umfangreiche Hilfe, das ist echt :spitze:
     
  11. daboom

    daboom Megabyte

    Ja ein clean target hatte ich natürlich noch nicht definiert.

    Dazu schreibst Du einfach zusätzlich in das Makefile in C:\ODE01:

    Code:
    
    clean:
      make -C build/gmake clean
    
    Beachte, dass das vor der Zeile mit "make -C ..." ein Tabulator sein muss.

    Hiermit definierst Du ein Target namens "clean". Alles was dieses Target macht, wenn es aufgerufen wird, ist einfach nur das clean Target des anderen Makefiles aufzurufen.

    Ungefähr dasselbe macht das "all" Target ja auch. Außer dass es vorher immer das Makefile in build/gmake erstellt und dann das all Target (all ist immer das Standardtarget soweit ich weiß) aufruft.

    Es gibt sicherlich noch einen eleganteren Weg, einfach grundsätzlich alle Target weiterzuleiten. Ich probier mal die Tage was und meld mich dann...

    Edit:
    Die Tage sind sehr kurz ;)
    Der elegante Weg findet sich im Anhang.
    Leider will er damit manchmal das Target "Makefile" bauen, was zu einer kurzen Warnmeldung führt.

    Die ganzen "Division by Zero" Warnings sehen übrigens böse aus. Was ist denn in dem Quellcode los? :eek:
     

    Attached Files:

    Last edited: Jun 1, 2009
  12. TheMars

    TheMars Byte

    Ja, das funktioniert - zumindest mehr als voher.

    Jetzt kompiliert er immer eine Minute lang, bevor dann nichts (?) passiert und im Log unz&#228;hlige "division by zero"-Warnungen erzeugt werden.

    In der Info-Box am Rand des Logs wird auf "Fehler insgesamt: 3" verwiesen. Diese lassen sich allerdings nicht so wirklich anhand der Ausgabe identifizieren.

    Edit: der Ordner C:\ODE01\build\gmake\obj\DebugSingleDLL ist jetzt ziemlich voll
     
  13. daboom

    daboom Megabyte

    Mist, so können sich die Posts überschneiden.

    Siehe editierten letzten Post... ;)
     
  14. TheMars

    TheMars Byte

    Code:
    Compiler: Default compiler
    Führt  make clean aus
    "Executing premake..."
    build/premake4 --file=build/premake4.lua --cc=gcc gmake --os=windows gmake
    Building configurations...
    Running action 'gmake'...
    Generating build/gmake/Makefile...
    Generating build/gmake/ode.make...
    Done.
    "Building target " Makefile
    make -C build/gmake CC=g++ Makefile
    make[1]: Entering directory `C:/ODE01/build/gmake'
    make[1]: Nothing to be done for `Makefile'.
    make[1]: Leaving directory `C:/ODE01/build/gmake'
    "Cleaning library..."
    make -C build/gmake clean
    make[1]: Entering directory `C:/ODE01/build/gmake'
    Cleaning ode
    make[1]: Leaving directory `C:/ODE01/build/gmake'
    "Removing generated Makefile"
    "Building target " all
    make -C build/gmake CC=g++ all
    make: *** build/gmake: No such file or directory.  Stop.
    make.exe: *** [all] Error 2
    Ausführung beendet
    Sofern ich das Log verstehe, führt er richtig premake aus
    Generating build/gmake/Makefile...
    "Building target " Makefile​
    aber dann scheint das irgendwie nicht ganz zu funktionieren
    make[1]: Nothing to be done for `Makefile'.​
     
  15. daboom

    daboom Megabyte

    Hast Du jetzt das Makefile aus dem letzten Anhang benutzt?
     
  16. TheMars

    TheMars Byte

    Ja, das vorherige hat auch wesentlich länger kompiliert
     
  17. daboom

    daboom Megabyte

    Mhh, irgendwas ist da komisch. Er führt offenbar für ein clean das Erstellen des Makefile aus und für alle anderen nicht. Also genau umgekehrt wie gewollt.

    Versuch mal, das gesamte clean Target aus dem Makefile zu entfernen. Dann sollte er gar nicht mehr probieren, das generierte Makefile zu löschen.
     
  18. TheMars

    TheMars Byte

    Okay, ich habe den clean-Block mit # auskommentiert.

    Er kompiliert wieder eine ganze Weile und wirft die "Division by zero"-Fehlermeldungen aus.

    In der Infobox am Rand des Log steht nun "Fehler insgesamt: 5"
     
  19. daboom

    daboom Megabyte

    Na die Division By Zero Teile kommen halt so aus dem Sourcecode. Da ändert man mit nem Makefile auch nix dran ;)

    Wenn es sich bei den "Errors" um "no rule to make target Makefile" handelt, kannst Du das vorerst ignorieren. Siehe Post #11.

    Ansonsten poste mal die Fehlermeldungen.
     
  20. TheMars

    TheMars Byte

    Okay, das scheint mir logisch ;)

    Das ist ein wenig problematisch, da ich im Compiler-Log garkeine Fehler finden kann. Lediglich die Info Box zeigt anscheinend 5 Fehler.

    Ich hab das Log mal hochgeladen:
     

    Attached Files:

Thread Status:
Not open for further replies.

Share This Page