mikrocontroller.net

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


Autor: obsCure (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: P. S. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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...

Autor: obsCure (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: obsCure (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: obsCure (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.