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