Wie macht man ein Makefile?
-
Nun habe ich nochmal ein Problem.
Und zwar mag der Compiler auf der Sun "-include $(DEPFILE)" nicht. Auf Linux tut das wunderbar. Wann wird denn das -include ausgeführt? Das ist mir noch nicht ganz klar. Kann ich das auch irgendwie anders schreiben?
Zum Beispiel "-include .depend" irgendwo anhängen? Oder wäre das falsch?
-
Habe aus den bisherigen Beiträgen noch nicht erkennen können ob du GNU-Make verwendest oder ein SUN-Make.
Bei GNU-Make bedeutet-include $(DEPFILE)
includiere $(DEPFILE) und ignoriere das include ohne Fehlermeldung wenn $(DEPFILE) nicht existiert ( wegen dem vorangestellten - ) Könnte eine GNU-Make Erweiterung sein.
Versuchs mal ohne -
Kurt
-
Sobald dein projekt größer wird würde ich aber auf die autotools (automake/autoconf) zurückgreifen.
-
Oder (falls du python kannst) scons (http://www.scons.org/)
-
Ich empfehle dir bakefile. Ist leicht zu lernen ( 10-20minuten) und kann Makefiles für sehr viele Compiler erstellen Darunter VC, GCC, MinGW-gcc, Borland ect.
rya.
Scorcher24
-
-
hmm.. eigentlich wollte ich nur dieses eine mal ein makefile benutzen und dann nie wieder
Das blöde ist eben, daß das Makefile bei Linux tut, aber auf der Sun nicht. Da bekomme ich bei der Zeile "-Include..."
den Fehler "make: Fatal error in reader: makefile2.txt, line 28: Unexpected end of line seen"So wie ich das sehe ist das auch ein Make von SunOS. Ganz ehrlich würde ich das ganze auch ohne make machen wenn ich wüßte wie. Inzwischen habe ich die ib rausgeschmissen und mich auf das nötigste beschrängt. Also 3 CPP und 2 H-Files. Die müßte ich in Abhängigkeit zueinander mit g++ compilieren. Das kann doch nicht so schwer sein, oder doch? Ich kenne leider die Optionen von g++ nicht und in der man rumscrollen bringt mich auhcnicht weiter
-
Also normal sollte es der aufruf von
g++ file1.cpp file2.cpp file3.cpp -o out
tun.
Du solltest dann noch mit "-I(..)" die includePfade und mit "-l" die Bibliotheken linken falls du welche brauchst. Die Reihenfolge der cpp Dateien ist eigentlich egal, da die Symbole später vom Linker zusammengesucht werde. Die includes müssen dann halt stimmen.
Was für Fehler bekommst du denn ??
rya.
Scorcher24
-
hi,
das ganze wird dann kompiliert und ich bekomme eine undefined reference to "alaw2linear" er findet also die Funktionen nicht. Diese Funktionen sind in einer .c definert, bzw. in einer .H deklariert und zwar als extern "C" Funktionen. Also klappt da wohl beim Linken was nicht
-
Naja, die Dateien musst du zum Projekt hinzufügen. Oder wenn du eine lib hast, halt die die library. Dann sollte der Linkerfehler verschwinden.
Wozu gehört denn diese ominöse Datei ??rya.
Scorcher24
-
wie meinst du das mit "zum Projekt hinzufügen"? Ich hab doch bei g++ kein Projekt in dem Sinn oder? In den anderen cpp Files werden alle h's Includiert. Aber das reicht ja anscheinend nicht.
Wozu die Datei gehört?? Das sind Funktionen die ich früher mal in C programmiert habe und die ich jetzt in meinem cpp Programm einbinden will.
-
Wenn du eine Funktion in einem Programm verwendest, musst du dem compiler sagen, wo er die symbole dazu findet. Das einfachste ist, die Datei mitzulinken. Also nimm den gcc aufruf von vorhin und füg die Datei einfach an. Dann sollte dieses unbefriedigte Symbol verschwinden.
rya.
Scorcher24edit: Mir geht ein Licht auf:
Wenn du zu der .c Datei einen Header hast, schreib mal extern"C" über die Deklarierung, bzw. deklarier mal die Datei so in einer .cpp Datei:extern "C" void foo();
Man kann sich alternativ ein Makro basteln:
#ifdef _clpusplus #define EXTERN_C extern "C" #endif
-
Die Fehlermeldungen von vorher sind dann weg. Dafür bekomme ich dann
file not recognized: File format not recognized
collect2: ld returned 1 exit statusirgendwas gefällt dem Compiler an dem File nicht.
Naja vielleicht ist #ifndef... und extern int... nicht ANSI-Konform und das muß es auf der SUN sein???keine Ahnung.
Aber das ärgert mich echtWieso muß der scheiß g++ Compiler und das make auf Linux anders reagieren als auf einer Sun.
-
Du hast geschrieben dass du eine Lib verwendest.
Woher stammt die ?? Ist die nativ von Linux?? Wenn Sie zu Solaris oder Windows gehört kannstes vergessen, weil jedes OS seine eigenen Symbole und auch ne andere Methode verwendet um Librarys, bzw dlls anzulegen.
rya.
Scorcher24
-
Also erst zu deinem alten Beitrag, also das mit dem "extern C" habe ich drinnen. ZWar etwas anders, aber sollte auch funktionieren. Vielleicht ändere ich das aber mal zum testen.
Und zu deinem letzten Post, die Lib hab ich inzwischen rausgeschmissen. Ich hab da eine Funktion benutzt auf die ich aber nicht angewiesen war.Ursprünglich sollte das ganze ein Programm an der Uni sein was auf einem normalen PC (intel/AMD) läuft. Aber jetzt sollte es auch auf einer SUN laufen, bzw. etwas wo Bigendian nutzt.
Naja ich muß nun leider einkaufen gehen. Aber vielleicht fällt dir ja noch was ein *hoff* ansonsten geh ich spätestens nächste Woche wieder an die Uni (ist ja vorlesungsfreie Zeit) und dann mach ich weiter. Irgendwo muß das Problem ja liegen. Und eine Lösung muß es ja auch geben... hoffe ich.
Danke auf jeden Fall für deine Hilfe