Probleme beim Makefile



  • Hallo, ich möchte mehrere Programme in jeweils verschiedenen Ordnern entwickeln. Alle sollen auf eine gemeinsame Bibliothek zugreifen. Diese befindet sich immer ein Verzeichnis höher unter lib/. Leider schaffe ich es nicht so recht und habe einen Umweg über das temporäre kopieren der Dateien gewählt. Dies funktioniert aber auch nicht so recht. Kann mir jemand da weiterhelfen?

    INCLUDE=../lib
    LIB=../lib
    OBJECTS=prog.o kollib.o
    
    #.PHONY=all clean FORCE
    
    CPPFLAGS = -DSKYCAN_DEVICE_TYPE=1
    
    all:	copy prog remove clean
    
    copy:
    	cp ../lib/kollib.h          ./kollib.h
    	cp ../lib/kollib.cpp        ./kollib.cpp
    
    %.o: %.cpp
    	gcc -c $< $(CPPFLAGS)
    
    prog$(OBJECTS)
    	gcc -o $@ $^ -lstdc++ 
    
    remove:
    	rm ./kollib.h
    	rm ./kollib.cpp
    
    clean:
    	rm -f *.o
    	rm -f *~
    


  • Hi kautz,

    du verwendest den gcc zum Kompilieren von C++ Dateien?

    Wenn deine Dateien in C und nicht C++ geschrieben sind, dann
    benenn sie in .c um.

    Wenn deine Dateien in C++ und nicht C geschrieben sind, dann
    verwende den g++ zum Kompilieren.

    Zu deinem Makefile:
    es sieht soweit nicht verkehrt aus, bis auf einen fehlenden Doppelpunkt
    in Zeile 18:

    prog: $(OBJECTS)
    

    Wenn ich mich nicht irre, sollte das so funktionieren.

    Schau dir mal das hier an: http://www.ijon.de/comp/tutorials/makefile.html

    Gruß mcr

    PS: ich habe es nicht ausprobiert, also steinigt mich nicht, sollte es doch
    falsch sein.



  • Wie ich schon befürchtet hatte,
    lag ich doch mit meiner Annahme falsch.

    Das Problem hier scheint zu sein, dass make, nachdem die Dateien
    kopiert wurden, keine Regel zum Kompilieren der kopierten Dateien findet.

    Hier mal ein Beispiel, wie du das umgehen kannst.

    Angenommen, wir haben ein Verzeichnis lib, das die Dateien a.c, a.h und
    Makefile enthält.
    Dieses Makefile sieht so aus:

    OBJECTS= a.o
    CFLAGS = -W -Wall -pedantic
    
    all:    prog clean
    
    prog: $(OBJECTS)
            ar cru liba.a  $(OBJECTS)
    
    %.o: %.c
            gcc -c $< $(CFLAGS)
    
    clean:
            rm -f *.o *~
    

    Durch dieses Makefile wird eine Lib "liba.a" erzeugt, die man zu seinem
    Projekt hinzulinken kann.

    Das Hauptprojekt besteht nun aus den Dateien: Makefile, main.c

    Im C-File wird a.h mit

    #include "lib/a.h"
    

    eingebunden.

    Das Makefile sieht dann wie folgt aus:

    OBJECTS= main.o
    CFLAGS = -W -Wall -pedantic
    
    all:    prog clean
    
    prog: $(OBJECTS)
            make -C lib
            gcc -o $@ $^ -lstdc++  -L./lib -la
    
    %.o: %.c
            gcc -c $< $(CFLAGS)
    
    clean:
            rm -f *.o *~
    

    In Zeile 7 wird ins Unterverzeichnis lib gewechselt und dort ein make
    ausgeführt.

    Der Zusatz in Zeile 8 -L./lib -la sagt dem Linker (gcc), dass die Lib
    liba.a (-la) aus der Verzeichnis ./lib (-L./lib) mit gelinkt werden soll.

    Ich glaube, damit sollte es nun laufen.
    Hier noch mal die Verzeichnisstruktur von meinem Beispiel:

    .
    ./lib
          Makefile
          a.c
          a.h
    ./Makefile
    ./main.c
    

    Gruß mcr



  • mmh ja danke,aber in dem Link steht nicht, wie ich Dateien in einem anderen Verzeichnis kompiliere und in meinem Verzeichnis mit mein Prog reinlinke.

    Es kann doch nicht die Lösung sein alles ständig hin und her zu kopieren.



  • ok danke du warst schon schneller;)

    Das hilft mir weiter. Du meinst also, ich sollte/muss eine lib erstellen um .c und .h-Dateien in externen verzeichnisse zu verwenden.



  • kautz schrieb:

    ok danke du warst schon schneller;)

    Das hilft mir weiter. Du meinst also, ich sollte/muss eine lib erstellen um .c und .h-Dateien in externen verzeichnisse zu verwenden.

    Nein, musst du nicht. Du kannst auch direkt die entsprechenden .o Dateien
    dem Linker übergeben. Ich finde es nur schöner, wenn man Unterverzeichnisse
    zu Libs zusammenfasst.

    Gruß mcr


Anmelden zum Antworten