Hallo,
ich schlage mich jetzt schon seit einiger Zeit damit rum ein Makefile zu
erstellen, das die kompilierten Objektdateien in einen extra Ordner
packt. Das funktioniert soweit auch ganz gut, nur der Linker mag es
nicht.
Hier ist meine gewünschte Struktur:
-src/
+ Makefile
+ *.cpp
+ obj/
Die Sourcedateien sind also im src/ Ordner, in dem wird auch das
Makefile aufgerufen. Die Objektdateien sollen in den Unterordner obj/
Damit die Abhängigkeiten mit den Objektdateien funktionieren, nutze ich
vpath:
Meine Source und Objektdateien:
1 | sources := file1.cpp file2.cpp
|
2 | objects := $(subst .cpp,.o,$(sources))
|
3 | target := libMein.so
|
Zum Linken hab ich jetzt folgende Regel erstellt:
1 | $(target): $(objects)
|
2 | $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
|
Wenn ich jetzt make aufrufe erhalte ich:
1 | make
|
2 | g++ -fPIC -I ../include -c -o obj/file1.o file1.cpp
|
3 | g++ -fPIC -I ../include -c -o obj/file2.o file2.cpp
|
4 | cc -shared file1.o file2.o -lm -o libMein.so
|
5 | cc: file1.o: No such file or directory
|
6 | cc: file2.o: No such file or directory
|
Mein Gedanke war jetzt, das der Fehler darin liegt das ich objects :=
$(subst .cpp,.o,$(sources)) ersetzte und dabei nicht der Pfad obj/ mit
angegeben wird.
Wenn ich mir aber die Regeln mit make -p ausgeben lasse dann erhalte
ich:
1 | make -p
|
2 |
|
3 | libMein.so: obj/file1.o obj/file2.o
|
4 | # Implicit rule search has not been done.
|
5 | # Implicit/static pattern stem: `'
|
6 | # Last modified 2008-09-05 23:30:20
|
7 | # File has been updated.
|
8 | # Successfully updated.
|
9 | # automatic
|
10 | # @ := libMein.so
|
11 | # automatic
|
12 | # % :=
|
13 | # automatic
|
14 | # * :=
|
15 | # automatic
|
16 | # + := obj/file1.o obj/file2.o
|
17 | # automatic
|
18 | # | :=
|
19 | # automatic
|
20 | # < := obj/file1.o
|
21 | # automatic
|
22 | # ^ := obj/file1.o obj/file2.o
|
23 | # automatic
|
24 | # ? := obj/file1.o obj/file2.o
|
25 | # variable set hash-table stats:
|
26 | # Load=8/32=25%, Rehash=0, Collisions=1/18=6%
|
27 | # commands to execute (from `Makefile', line 25):
|
28 | $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
|
Hier zeigt der Ausdruck an das ^ := obj/file1.o obj/file2.o, also der
Pfad mit angegeben wird. Warum ist er dann beim Linken nicht dabei?
Danke für die Hilfe.