Makefile Frage
-
Hallo zusammen,
Ich moechte eine Reihenfolge von c-dateien unter einem bestimmten verzeichnis
durch meine Make file kompilieren. Diese Quellcodes befinden sich unter
./src Verzeichnis. Makefile befindet sich in ./Durch diese Weise:
CC=gcc SRCDIR=src/ OBJECTDIR=src/ BINDIR=bin/ LIBDIR=lib/ INCLUDE=-I/usr/include/libxml2 -I./include/ LIBS=-lxml2 CFLAGS=-Wall -g -dH -fpic SHAREDFLAGS=-shared OBJECTS:=$(patsubst $(SRCDIR)%.c, $(OBJECTDIR)%.o, $(wildcard $(SRCDIR)*.c)) $(OBJECTDIR)%.o: $(SRCDIR)%.c $(CC) -c $(CFLAGS) $(INCLUDE) $< -o $@ client: client.o libcolor.so $(CC) -L./lib -lcolor -o $(BINDIR)client $(SRCDIR)client.o server: server.o libcolor.so $(CC) -L./lib -lcolor -o $(BINDIR)server $(SRCDIR)server.o libcolor.so: color.o $(CC) $(SHAREDFLAGS) -o $(LIBDIR)libcolor.so $(SRCDIR)color.o libxmlparser.so: xmlparser.o $(CC) $(SHAREDFLAGS) -o $(LIBDIR)libxmlparser.so xmlparser.o all: client server libcolor.so libxmlparser.so # $(CC) $(CFLAGS) $(LIBS) -o (BINDIR)parserx $(OBJECTS) clean: rm -rf *.o *.so $(BINDIR)* $(LIBDIR)*
habe ich versucht, die komplette Objekt- und Binary-Dateien zu erstellen. Leider
ohne Erfolg. Egal welche "make" ausgefuehrt wird, kriege ich eine Fehlermeldung:make: *** No rule to make target `client.o', needed by `client'. Stop.
Woran kann der Fehler liegen? Ich habe nach meiner Suche im Forum was
aehnliches gefunden was mir aber nicht weitergeholfen hat.
http://www.c-plusplus.net/forum/viewtopic-var-t-is-209955-and-highlight-is-makefile.htmlDanke,
-
du brauchst eine regel für client.o so wie du sie auch für andere dinge gemacht hast. so in etwa sollte die aussehen:
client.o: client.c $(CC) $(CFLAGS) client.c
blan
-
Gib src/client.o als Dep an.
-
jsbach schrieb:
client: client.o libcolor.so $(CC) -L./lib -lcolor -o $(BINDIR)client $(SRCDIR)client.o
Du musst den Pfad angeben. Probiere mal folgendes:
client: $(SRCDIR)/client.o... :
}-Tux-{
-
Danke fuer die Antwort. Ich dachte ich mache das schon wenn ich diesen Regel:
$(OBJECTDIR)%.o: $(SRCDIR)%.c $(CC) -c $(CFLAGS) $(INCLUDE) $< -o $@
benutze. Dadurch sollen eigentlich alle src/.o files mit src/.c in
Abhaengigkeit stehen. Oder etwa nicht?Gruss,
-
Ja, aber als Abhängigkeit zu client steht nur client.o. Die Datei heisst aber durch die Regel von $(OBJECTDIR)%.o src/client.o und nicht client.o.
-
LordJaxom schrieb:
Ja, aber als Abhängigkeit zu client steht nur client.o. Die Datei heisst aber durch die Regel von $(OBJECTDIR)%.o src/client.o und nicht client.o.
Ok, verstehe. Ich habe nach deiner Posting meine Makefile entsprechend geaendert:
OBJECTS:=$(patsubst %.c, %.o, $(wildcard )*.c)) %.o: %.c $(CC) -c $(CFLAGS) $(INCLUDE) $< -o $@
Damit habe ich die $(OBJECTDIr)%.o Abhaaengigkeit abgeschaffen, nicht wahr?
Im Gegensatz zu meiner Erwartung:client: client.o libcolor.so $(CC) -L./lib -lcolor -o $(BINDIR)client $(OBJECTDIR)client.o
reagiert der make genauso empfindlich wie vorhin.. Habe ich nicht mit der Code
da oben vereinbart, dass aus allen c dateien unter dem aktuellen verzeichnis
objekt dateien erstellt werden soll (mit dem selben namen aber o endung )und
dass ich sie auch als labels benutzen kann?Sorry wenn ich so viele frage, ich versuch die make logik zu verstehen.
Gruss,
-
Noch bei Makefile Frage:
Kann man per Makefile einfache shell commandos ausfuehren? Zb im Bezug
auf mein Program:export LD_LIBRARY_PATH="/pfad/allgemein:/pfad/zu/meiner/bibl"
Danke & Gruss,
-
Make macht eigentlich nichts anderes, als _jede_ Zeile eines Targets (also alles was eingerückt ist) in _jeweils_ einer Shell auszuführen. Das mit dem export wird also nur funktionieren, wenn du die Anweisung die das benötigst in die gleiche Zeile packst (zB mit && oder ; verknüpfen).