Forum: Compiler & IDEs Makefile und Unterverzeichnisse für Quellen


von obsCure (Gast)


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?

: Verschoben durch Moderator
von P. S. (Gast)


Angehängte Dateien:

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

von obsCure (Gast)


Angehängte Dateien:

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.

von obsCure (Gast)


Lesenswert?

Nachtrag:
Interessanterweise erhalte ich den Linkerfehler (undefined reference) 
ebenfalls wenn ich alle Dateien als ".c" kompiliere.
Die Objekte werden wie sonst auch problemlos erstellt.

von P. S. (Gast)


Lesenswert?

Lies dich mal in die Wunder der extern "C"-Deklaration ein.

Da unter 32.3 ist noch Beispiel, auch wenn nicht viel zum Hintergrund 
dazu da steht:

http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html

von obsCure (Gast)


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.

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.