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
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...
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.
Nachtrag: Interessanterweise erhalte ich den Linkerfehler (undefined reference) ebenfalls wenn ich alle Dateien als ".c" kompiliere. Die Objekte werden wie sonst auch problemlos erstellt.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.