Forum: PC-Programmierung Makefile extra Objektpfad


von Günter -. (guenter)


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.

von Lars (Gast)


Lesenswert?

Ich glaube, der folgende Link erklärt genau das Problem:

http://make.paulandlesley.org/vpath.html

von Klaus W. (mfgkw)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.