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.html

    Danke,



  • 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).


Anmelden zum Antworten