mikrocontroller.net

Forum: PC-Programmierung Makefile extra Objektpfad


Autor: Günter -.. (guenter)
Datum:

Bewertung
0 lesenswert
nicht 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:
vpath %.o obj

Meine Source und Objektdateien:
sources := file1.cpp file2.cpp
objects := $(subst .cpp,.o,$(sources))
target := libMein.so
Zum Linken hab ich jetzt folgende Regel erstellt:
$(target): $(objects)
  $(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@

Wenn ich jetzt make aufrufe erhalte ich:
make
g++  -fPIC -I ../include  -c -o obj/file1.o file1.cpp
g++  -fPIC -I ../include  -c -o obj/file2.o file2.cpp
cc -shared  file1.o file2.o  -lm -o libMein.so
cc: file1.o: No such file or directory
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:
make -p

libMein.so: obj/file1.o obj/file2.o
#  Implicit rule search has not been done.
#  Implicit/static pattern stem: `'
#  Last modified 2008-09-05 23:30:20
#  File has been updated.
#  Successfully updated.
# automatic
# @ := libMein.so
# automatic
# % := 
# automatic
# * := 
# automatic
# + := obj/file1.o obj/file2.o
# automatic
# | := 
# automatic
# < := obj/file1.o
# automatic
# ^ := obj/file1.o obj/file2.o
# automatic
# ? := obj/file1.o obj/file2.o
# variable set hash-table stats:
# Load=8/32=25%, Rehash=0, Collisions=1/18=6%
#  commands to execute (from `Makefile', line 25):
  $(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.

Autor: Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube, der folgende Link erklärt genau das Problem:

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

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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:
OBJ_DIR := obj
sources := file1.cpp file2.cpp
objects := $(subst .cpp,.o,$(sources))
objects_mit_dir := $(addprefix $(OBJ_DIR)/,$(objects))

test :
  @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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.