Makefile extra Objektpfad

#977861
Lesenswert?

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:
1
vpath %.o obj

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.
#1188732
Lesenswert?

(ok, die Frage ist schon etwas alt, aber vielleicht hilft es ja 
jemandem...)

VPATH scheint nicht die Lösung zu sein.

Ich würde mir die korrekten Namen lieber von Hand bauen:
1
OBJ_DIR := obj
2
sources := file1.cpp file2.cpp
3
objects := $(subst .cpp,.o,$(sources))
4
objects_mit_dir := $(addprefix $(OBJ_DIR)/,$(objects))
5

6
test :
7
  @echo $(objects_mit_dir)

$(objects_mit_dir) enthält jetzt "obj/file1.o obj/file2.o", und das kann 
man zum Linken nehmen.

(Das funktioniert natürlich nur mit GNU-make.)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren