makefile



  • hast in c++ eh zu entscheiden, welches system und so und das dann doppelt zu machen klingt net fein. zumal man makefiles nicht anfassen mag. schätze, du solltest hier lieber mal ne ./sys/win32/*.cpp includen oder noch nen besseren tick finden. oder sich ne schnittstelle zum makefile überlegen, damit das trotzdem unangetastet bleiben kann, obwohl man für verschiedene systeme manche sachen dazumachen mag.



  • @nman
    Danke fein. Ich muss wohl schlicht und einfach nochmal versuchen die Philosophie hinter make zu verstehen.

    für was brauchste das denn?

    Ich habe eine Klasse die auf Posix-kompatiblen Funktionionen aufbaut. Im Normalfall reichen also ein paar includes. Unter Win98 gibt es aber genau diese Posix-kompatiblen Funktionen nicht. Also verwende ich in diesem Fall selbst implementierte Funktionen mit der selben Schnittstelle. Die Definitionen dieser Funktionen müssen nun aber natürlich mit übersetzt und gelinkt werden. Also habe ich unter Win98 eine cpp-Datei mehr.

    [ Dieser Beitrag wurde am 04.05.2003 um 11:16 Uhr von HumeSikkins editiert. ]



  • Original erstellt von HumeSikkins:
    **Ich habe eine Klasse die auf Posix-kompatiblen Funktionionen aufbaut. Im Normalfall reichen also ein paar includes. Unter Win98 gibt es aber genau diese Posix-kompatiblen Funktionen nicht. Also verwende ich in diesem Fall selbst implementierte Funktionen mit der selben Schnittstelle. Die Definitionen dieser Funktionen müssen nun aber natürlich mit übersetzt und gelinkt werden. Also habe ich unter Win98 eine cpp-Datei mehr.
    **

    schreibe noch ein header und cpp,
    in normal fall includet sie die postfix header, unter win98 includet sie deinen header und in die cpp datei beinhaltet deinen code

    dann arbeites du mit den gleichen header und das makefile ist immer gleich



  • schreibe noch ein header und cpp

    Genau das habe ich gemacht. Habe jetzt dirstream.h, dirstreamw32.h und dirstreamw32.cpp.

    in normal fall includet sie die postfix header

    Genau. dirstream.h macht sowas:

    #ifdef HAT_POSIX_KRAM
    #include <dirent.h>
    #include <sys/stat.h>
    #else
    #include "dirstreamw32.h"
    #endif
    

    die cpp datei beinhaltet deinen code

    Richtig. Die dirstreamw32.cpp beinhaltet die Definitonen der Funktionen wir opendir, readdir usw.

    dann arbeites du mit den gleichen header und das makefile ist immer gleich

    So. Und hier kann ich dir nicht mehr folgen. Ich arbeite in der tat immer mit dem gleichen Header. User müssen immer nur dirstream.h inkludieren. Das makefile kann meiner Meinung nach aber nicht gleich bleiben, da es unter Win98 noch die dirstreamw32.cpp berücksichtigen muss.

    Was übersehe ich?



  • dirstreamw32.cpp

    #ifdef WIN32
    //dein code
    #else
    //nix
    #endif
    

    auch unter unix wird dann die dirstream32.cpp gelinkt, blos sie ist leer



  • Oha. So einfach kann es sein 🙂
    Danke fein.



  • und wenn jemand standard-c++ nehmen muß, um das gewurstele los zu werden. das makefile ist erstmal angemessen, weils unerhört einfach zu benutzen.

    ja klar, zum testen des Projekts etc. ist das natürlich gut, ich schreib mir am Anfang des Projekts auch idr. erst eine Makefile per Hand (vorallem da ich automake nicht mag)

    das widerspricht eigentlich meinen vorstellungen von nem einfacen makefile. gehen tut das. aber ibts keinen anderen weg? für was brauchste das denn?

    jo, einfach ist das nicht mehr aber nötig in der Praxis und dafür nimmt man ja auch eigentlich ein configure Script aber langsam geht die Mode dahin, dass man alles von Make bearbeiten lässt, ist eh viel praktischer.

    wobei in Humes Situation eh kein autoconf noch Makefile Tricks mit uname helfen, da Windows nicht POSIX kompatibel ist und man auch nicht vom User erwarten kann, dass der Cygwin oä. installiert hat



  • [ Dieser Beitrag wurde am 07.05.2003 um 04:10 Uhr von volkard editiert. ]



  • @volkard
    Nur um noch mal sicher zu gehen: Du hast nichts dagegen, wenn man dein makefile nahezu 1:1 übernimmt? Ist nämlich genau das was ich gerade brauche.



  • Original erstellt von HumeSikkins:
    @volkard
    Nur um noch mal sicher zu gehen: Du hast nichts dagegen, wenn man dein makefile nahezu 1:1 übernimmt? Ist nämlich genau das was ich gerade brauche.

    nix dagegen. ich habs doch nur aus der hilfe von make zusammenkopiert.

    aber wenn du mal was rausfundest, wie man die compilezeiten senken kann (mingw hab ich), dann sag bescheid. precompiled headers sind wohl nur angekündigt aber nicht verfügbar.



  • aber wenn du mal was rausfundest, wie man die compilezeiten senken kann (mingw hab ich), dann sag bescheid.

    Oh. Mit dem Problem quäle ich mich auch gerade rum. Sowohl mit dem mingw, als auch mit dem gcc 3.2.2. Mit dem gcc 2.95 hatte ich wenigstens noch das Gefühl das es langsam voran geht. Jetzt ist aber nicht mal mehr schleichend das richtige Wort 🙂



  • Original erstellt von HumeSikkins:
    [quote]Sowohl mit dem mingw, als auch mit dem gcc 3.2.2. Mit dem gcc 2.95 hatte ich wenigstens noch das Gefühl das es langsam voran geht. Jetzt ist aber nicht mal mehr schleichend das richtige Wort 🙂

    hab jetzt mingw mit dem gcc 3.2.3 drin. der scheint deutlich flotter als der mingw mit dem gcc 3.2.



  • ich hätte es fast vergessen, aber ich pack den Thread mal in die FAQ



  • Der Link (von nman) zum GNU make-Handbuch funktioniert nicht. 😞 (Bitte korrigieren.)



  • Salve,

    bei all dem bisher angebotenen Make-Files blicke ich jetzt nicht mehr durch.
    Welches Makefile ist denn nun das Ultimative?

    Eines der hier angebotenen oder dieses hier:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-88418.html

    Dazu auch gleich noch ein paar Fragen:

    1.)
    Was bewirkt "TARGET := ./program "?

    2.) Gibt es bei "CXXFLAGS := " eine Reihenfolge der Parameter einzuhalten?

    3.) Bei "LIBS := " sollen wohl die zusätzlich zu includierenden Libs eingebunden werden, z.B., wenn man die SDL-Libs verwenden möchte?

    4.) Ist es ratsam bei Libs standardmäßig immer alle Libs anzugeben, die man hat oder sollte man nur die angeben, welche man auch wirklich benötigt.
    Es wäre nämlich klasse, wenn man alle möglichen Libs eintragen könnte und trotzdem am Ende vom Compiler nur die genommen werden, welche auch wirklich nur gebraucht werden. Und gibt bei "LIBS := " nur Libs (.lib) oder auch Header-Dateien (.h) und DLL´s an? Wenn nein, wie kann man im Makefile noch die Header-Dateien und DLL´s, sofern man welche hat vermerken?

    Ich danke vielmals im Voraus!

    Gruß

    Schlitzauge 🙂 🙂 🙂



  • Schlitzauge schrieb:

    bei all dem bisher angebotenen Make-Files blicke ich jetzt nicht mehr durch.
    Welches Makefile ist denn nun das Ultimative?

    Meins natürlich.

    Eines der hier angebotenen oder dieses hier:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-88418.html

    Die sind eigentlich alle das selbe. Ein paar Trick oder persönliche Vorlieben hie und da. Im Zweifel nimm das neueste, also das im anderen Thread.

    1.)
    Was bewirkt "TARGET := ./program "?

    Name der ausführbaren Datei, die erstellt wird.

    2.) Gibt es bei "CXXFLAGS := " eine Reihenfolge der Parameter einzuhalten?

    Nein.

    3.) Bei "LIBS := " sollen wohl die zusätzlich zu includierenden Libs eingebunden werden, z.B., wenn man die SDL-Libs verwenden möchte?

    Ja.

    4.) Ist es ratsam bei Libs standardmäßig immer alle Libs anzugeben, die man hat oder sollte man nur die angeben, welche man auch wirklich benötigt.
    Es wäre nämlich klasse, wenn man alle möglichen Libs eintragen könnte und trotzdem am Ende vom Compiler nur die genommen werden, welche auch wirklich nur gebraucht werden. Und gibt bei "LIBS := " nur Libs (.lib) oder auch Header-Dateien (.h) und DLL´s an? Wenn nein, wie kann man im Makefile noch die Header-Dateien und DLL´s, sofern man welche hat vermerken?

    Alle libs geht auch. Manchmal aber kann eine lib zu größerer ausführbarerer Datei führen, weshalb ich sparsam wäre. Die dll wird normalerweise von der lib benutzt, brauchst dich nicht drum zu kümmern. Zusätzliche Header-Verzeichnisse kannsz Du AFAIR mit -I in den CXXFLAGS noch dazumachen.



  • Benutze lieber die Autotools, mit Make endet das recht schnell in einem mittelgroßen Gefrickel. Insbesondere ist dank configure der Build-Ordner flexibel auswählbar, so dass man seinen Source-Tree nie mit Dateien zumüllen muss, oder Schreibrechte darin benötigt.

    Der Mehraufwand ist nur marginal, dafür ist der Komfortgewinn nicht aufzuwiegen.



  • Meins natürlich.

    Welches von den vielen?

    Könnte man in Zukunft btw. zu den bisherigen, den Einsatzzweck dazuschreiben? Ich meine ja nur, damit auch Neulinge besser verstehen, wann welches Makefile denn am besten für welchen Fall ist.

    Zitat:

    Eines der hier angebotenen oder dieses hier:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-88418.html

    Die sind eigentlich alle das selbe. Ein paar Trick oder persönliche Vorlieben hie und da. Im Zweifel nimm das neueste, also das im anderen Thread.

    Hmm??? Was nun, Deines, ein anderes oder das im Nachbarthread, wobei das eigentlich ein Thread aus der FAQ ist?

    Zitat:

    1.)
    Was bewirkt "TARGET := ./program "?

    Name der ausführbaren Datei, die erstellt wird.

    Das habe ich soweit schon vernommen. Ich meinte aber eher das "./program".
    Woher nimmt denn dieser String die nötige Information?

    Zitat:

    3.) Bei "LIBS := " sollen wohl die zusätzlich zu includierenden Libs eingebunden werden, z.B., wenn man die SDL-Libs verwenden möchte?

    Ja.

    Muss man immer direkt die Lib-Dateien angeben, also *.lib? Oder reicht es, wenn man ein Verzeichnis mit LIB-Dateien angibt?
    Und, was muss ich bei "LIBS := " machen, um mehrere LIB-/LIB-Verzeichnisse anzugeben, mit Komma trennen?

    Die dll wird normalerweise von der lib benutzt, brauchst dich nicht drum zu kümmern.

    Ja schon. Ich meinte aber, wenn ich eine separate DLL-Datei habe.
    Wo muss ich da was einstellen, damit diese mit beim Compilieren/Linken (was denn nun?) einbezogen wird, jeweils statisch, als auch dynamisch?

    Zusätzliche Header-Verzeichnisse kannsz Du AFAIR mit -I in den CXXFLAGS noch dazumachen.

    Wie genau? Z.B. "-I Header1.h Header2.h, Header_n.h ..." oder anders?
    Und wie wird das dann bei IDE´s gehandhabt? Ich meine, dort brauch man sich nicht wirklich um das Hinzufügen von *.h-Dateien zu kümmern. Einfaches "#include <blabla.h>" im Quelltext reicht. Kann es sein, dass es einfacher ist *.h-Dateien über die PATH-Variable global zur Verfügung zu stellen, sodass es nur noch ausreicht im Quelltext die erforderlichen Header-Dateien einzubinden?

    Benutze lieber die Autotools, mit Make endet das recht schnell in einem mittelgroßen Gefrickel. Insbesondere ist dank configure der Build-Ordner flexibel auswählbar, so dass man seinen Source-Tree nie mit Dateien zumüllen muss, oder Schreibrechte darin benötigt.

    Kenne mich leider damit nicht aus. Das mit den Makefiles klingt für mich interessant, weil ich dann weiß, wo ich was einsetzen muss, für den und den Einsatzzweck.

    --------------------------------------------------------

    5.)
    Mal noch eine Zusatzfrage.
    Ich verwende Code::Blocks, sowie Eclipse in Verbindung mit MinGW/MSYS.
    Macht es sinn, hier eigene Makefiles (eines der obigen bzw. des Nachbarthreads aus der FAQ) einzusetzen? Wenn ja, wo muss man in Code:Blocks z.B. was angeben, um die eigene Make-File mit einzubinden (Compiler/Linker/???)?

    Ich danke nochmals vielmals im Voraus!!

    Gruß

    Schlitzauge 🙂 🙂



  • Sieht ja wild aus. Da lob ich mir Ant und Maven2. 🤡



  • byto schrieb:

    Sieht ja wild aus. Da lob ich mir Ant und Maven2.

    ist normal, makefiles sind relikte aus der programmierer-steinzeit, die einfach nicht totzukriegen sind.
    🙂


Anmelden zum Antworten