PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : make ?



wolfgang
30-03-2000, 18:21
oh je!

jetz habe ich so viele beispiele abgetippt und noch kein einziges make funktioniert bei mir

was mache ich falsch?
tut mir jemand den gefallen und schribit mir ein makefile als ersatz fuer meinen aufrufbeispiel "gcc -o test test.c" oder gar
gcc -o test test.c libsonstwas.a" ???
ich glaube den rest kriege ich dann schon hin

danke schon mal

gruss
wolfgang :-)

thommy
31-03-2000, 09:55
Hallo Wolfgang,

der default-Fehler, dem die meisten make-Neulinge begegnen, ist die Syntax...

Aber zunächst ein simples Beispiel:

<pre>
# Variablenvereinbarungen, z.B.
CC=/usr/bin/gcc
RM=/usr/bin/rm
CFLAGS=-g
LIBRARYPATH=/usr/local/lib

# Jetzt ein "Target"
# Aufbau: <Name> : <wovon abhängig>
test: test.c
$(CC) $(CFLAGS) test.c -o test.o \
-L$(LIBRARYPATH) -lc

# Auch ans Aufraümen denken
clean:
$(RM) test *.o
</pre>

Noch einige Hinweise
<ul>
Der Name des Ziels sollte dem Dateinamen entsprechen; im Beispiel test. Damit ist make in der Lage, Abhängigkeiten zu ermitteln (Ist die Quelldatei neuer als die kompilierte Datei...?)
</li>

Abhängigkeiten ist eine Liste von Dateien (Bibliotheken), von denen das Programm abhängt. In unserem Fall muss test neu generiert werden, falls test.c
modifiziert wurde.
</li>


Unterhalb der Zielzeile (Target) folgen die Anweisungen. Und hier ist wichtig, dass diese Zeile mit einem Tabulator beginnt (keine Leerzeichen!!!). Alles innerhalb <code>$(...)</code> wird substituiert; diese Variablen wurden am Anfang des Makefiles definiert. Normalerweise gehören alle Anweisungen auf eine Zeile, reicht dazu der Platz nicht aus, ist jede Zeile bis auf die letzte durch ein <code>\</code> abzuschließen (Vorsicht: danach dürfen keine Leerzeichen stehen!)
</li>

Soweit ein erster Überblick über Makefiles...

Gruß, Thomas
[/list]

steven
31-03-2000, 10:53
hi thomas,
auch ich dank dir
steven

thommy
31-03-2000, 11:05
Kleiner Nachtrag zur obigen Ausführung

<ol>
Das Kommando rm befindet sich nach File System Standard im Verzeichnis /bin und nicht wie angegeben unter /usr/bin</li>

Und zu den Bibliotheken... eine Bibliothek hat üblicher Weise den Namen <code>libname.a</code>. Dem Compiler wird sie aber in der Form <code>-lname</code> mitgeteilt. D.h. im obigen Beispiel ist die Bibliothek [b]libc.a</code> gemeint (und diese muss niemals explizit angegeben werden; der Compiler sollte sie immer finden)
</li>
[/list=a]

Thomas

wolfgang
31-03-2000, 18:25
ECHT SUPER!

das klappt ja auf anhib und ist sehr komfortabel,
nun passiert bei mir aber folgendes:
die ausfuerbare datei hat die endung .o nun habe ich (ja nicht gaz doof) das .o aus dem beispiel weg gemacht und vor den clean ein # gestellt (soll ja nicht geloescht werden), aber ob ich da nun ein clean drin habe oder nicht spielt gar keine rolle !?

na ja das make funzt soweit sogut und vieleicht helfen diese SUPERTIPS auch anderen

ich jedenfalls bin gluecklich, nochmals danke an euch thommy und Christoph

gruss
wolfgang :-)

Christoph
01-04-2000, 00:39
Noch ein Problem, über das jeder Neuling stolpert:

Das Executable "test" wird sich nicht starten lassen aus folgendem Grund:

Die Shell hat ein eingebautes Kommando "test", das immer statt des Executables "test ausgeführt wird! Da nutzt es nichts, "." in den Suchpfad aufzunehmer, chmod +x einzugeben und was der verzweifelte Newbie noch alles probieren mag....

Also: das erste C-Programm niemals "test nennen...

thommy
03-04-2000, 08:55
Also weiter im Makefile/make-Anfänger-Kurs...

Wird make ohne Argumente aufgerufen, sucht es im aktuellen Verzeichnis nach einer Steuerdatei mit dem Namen makefile. Wird dieses nicht gefunden, sucht make nach Makefile. Wird auch dieses nicht gefunden, hagelt's die Meldung
no rule to make target. Kommt Dir sicher bekannt vor, oder http://www.linuxforen.de/ubb/smile.gif

Angenommen, make findet eine solche Steuerdatei... dann sucht es in dieser Datei nach dem ersten Target (Ziel), also einer Zeile &li;zielname&gt; : &lt;Abhängigkeiten&gt; und führt alle Schritte bis zum nächsten Ziel aus!!!

Da clean im Beispiel das zweite Target ist, wird es nicht ausgeführt, es sei denn: make wird mitgeteilt, dass es genau dieses Target abarbeiten soll:

Also make clean und schon klappts auch mit dem Saubermachen http://www.linuxforen.de/ubb/smile.gif

Thomas

PS: zum .o. Da habe ich einen kleinen Fehler gemacht... in der betreffenden Zeile $(CC) $(CFLAGS) test.c -o test.o \ gibt die Option -o &lt;name&gt; an, dass der Compiler die Ausgabe in die Datei name umlenken soll (sonst heißt das Binary a.out). Der Name sollte also nicht test.o lauten, sondern test (Achtung: Vergleiche Bemerkung von Christoph)

wolfgang
04-04-2000, 18:32
eure tips sind besser als 100 buecher!

DANKE

(heute habe ich endlich auch mal ein paar antworten zu anderen themen gewuss und langsam machen meine LINUXKISTEN spass)

gruss
wolfgang :-)