Makefile und Unterverzeichnisse für Quellen

Gast #2014051
Lesenswert?

Hallo

Ich verwende momentan das Makefile-Template aus dem Wiki.
Einige Quelldateien liegen in Unterverzeichnissen unterhalb der 
Projektwurzel. Da sobald ich Quellen mit Unterverzeichnissen angebe, die 
Objekte auf Grund nicht vorhandener Unterverzeichnisse innerhalb des 
Objektverzeichnisses nicht erstellt werden können, habe ich eine 
Pfadsubstitution verwendet.

Mein aktuelles Makefile: http://uc.pastebin.com/w7wuMRYV
Ich habe nur die 7 markierten Zeilen verwendet.

Sobald ich eine Quelle aus einem der SUBDIRS in "main.cpp" einbinde 
meldet der Linker "undefined reference" zur aufgerufenen Funktion. Die 
Objekte selbst werden wie gewünscht unter "obj"  erstellt.

Hat jemand einen Tip für mich?

Alternativ - wie kann ich Quellcodes aus Unterverzeichnissen im original 
Template verwenden?
Gast #2014062
Lesenswert?

Hm, waere schoen, wenn ich noch genau wuesste, was ich da bei mir alles 
geaendert habe, aber es funktioniert ;o)

Ich glaube die Aenderungen beschraenkten sich auf die Erweiterung der 
Direktiven fuer .c, .cpp und .S um die Subverzeichnisse anzulegen:

# Compile: create object files from C source files.
$(OBJDIR)/%.o : %.c
  @mkdir -p $(OBJDIR)/$(dir $<)
  @echo
  @echo $(MSG_COMPILING) $<
  $(CC) -c $(ALL_CFLAGS) $< -o $@

Ich habe da noch ein paar andere Erweiterungen drin, also besser nicht 
einfach das ganze Makefile kopieren...
Angehängte Dateien:
Gast #2015122
Lesenswert?

Hallo Peter,

vielen Dank für das Beispiel, leider löst dies mein Problem auch nicht, 
inzwischen habe ich festgestellt, dass die Ursache der Linkerfehler 
offenbar in der Mischung aus C und C++ liegt.

Wenn ich in die Datei main.cpp lcd.c einbinde, findet der Linker die 
zugehörigen Aufrufe aus lcd.c nicht (undefined reference to lcd_home()).

Wenn ich lcd.c in lcd.cpp umbenenne, so das diese mit C++ Erweiterung 
kompiliert wird, funktioniert alles wie gewünscht.

Leider funktioniert dieser Workaround nicht für clksys_driver.c (Atmel 
Clocksystem Beispiel für XMega). Dort kommt es mit .cpp Erweiterung zu 
Fehlern welche wahrscheinlich aus den Inline-Asm-Funktionen herrühren. 
Als .c Datei werden wieder die Referenzen nicht gefunden.

Das gleiche Problem der nicht auflösbaren Referenzen besteht auch anders 
herum wenn ich main.c mit lcd.cpp kompiliere.

PS:
Ich habe das Projekt mal drangehängt, ich arbeite unter Ubuntu 10.04.
Angehängte Dateien:
Gast #2016674
Lesenswert?

Das hatte ich vorher sogar so drin ;).

Die eigentliche Falle lag in meinem Makefile wo
CFLAGS+= --combine -fwhole-program
aktiv war. Das geht bei gemischten C/Cpp Sourcen entsprechend in die 
Hose.

Wenn man dann die C Sourcen noch mit extern "C" eingebunden werden 
funktioniert alles bestens.

Vielen Dank für die Tipps.

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