www.mikrocontroller.net

Forum: Compiler & IDEs Compiler erzeugt fehlerhaftes Objektfile


Autor: JAN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen! Ich verwende AVRStudio 4.12 SP4 B498 und WINAVR 20060421 
und stehe hier vor einem merkwürdigen Problem. Eine Sourcecodedatei 
enthält u.a. eine Funktion namens SYS_InitCom. Wenn ich diese in der 
main aufrufe, bekomme ich beim Linken die Fehlermeldung:
"../First.c:121: undefined reference to `SYS_InitCom'"
Nun habe ich mir die Symbolnamen im Objektfile angesehen und finde dort 
die Bezeichnung _Z11SYS_InitComhhhl statt SYS_InitCom. Verwende ich in 
main dann tatsächlich diesen Namen (und trage ihn auch entsprechend im 
Header der betreffenden Sourcecodedatei ein), läuft der Linker 
problemlos durch und erzeugt ein HEX-File (welches nicht funktioniert, 
aber das kann noch andere Gründe haben). Was läuft hier falsch?

Autor: Peter S. (psavr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da Du kein Code postest, kann ich nur mutmassen was Du falsch machst:

Aber gehe mal davon aus, dass der Fehler im Programm bzw. Projekt liegt 
und nicht am Compiler. Hast Du die Funktionsprototypen im Headerfile 
deklariert und dieses im main-File includiert?

Starte ein [Build] => [Rebuild All]: Welches ist dann die erste 
Fehlermeldung oder Warning die rausgespuckt wird?

Zip und poste Dein gesammtes Projekt, falls Du nicht weiterkommst und 
weitere Hilfe möchtest.

Gruss Peter

Autor: JAN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter, danke für die schnelle Antwort.

"Hast Du die Funktionsprototypen im Headerfile
deklariert und dieses im main-File includiert?"

Ja, hab ich.

"Starte ein [Build] => [Rebuild All]: Welches ist dann die erste
Fehlermeldung oder Warning die rausgespuckt wird?"

Genau die, die ich in meinem ersten Post genannt habe.

Ich habe diesmal alle Files mal beigfügt.

Grüße, Ralf

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
JAN wrote:
> Ich habe diesmal alle Files mal beigfügt.

Leider nicht.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Nun habe ich mir die Symbolnamen im Objektfile angesehen und finde dort
> die Bezeichnung _Z11SYS_InitComhhhl statt SYS_InitCom.

Das heißt, dass du diese Funktion als C++ übersetzt hast statt als C. Du 
kannst in C++ definierte Funktionen nur dann von C aus aufrufen, wenn du 
sie als extern "C" deklarierst.

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

Bewertung
0 lesenswert
nicht lesenswert
"Das heißt, dass du diese Funktion als C++ übersetzt hast statt als C"

Aha, und wie habe ich das getan? Das war nämlich nicht mein Ansinnen.

Wieso hat denn das mit dem Dateianhang nicht geklappt? Nochmal 
versuchen...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus wrote:

> Das heißt, dass du diese Funktion als C++ übersetzt hast statt als
> C. Du kannst in C++ definierte Funktionen nur dann von C aus
> aufrufen, wenn du sie als extern "C" deklarierst.

Nein, das ist umgekehrt (C-Funktionen aus C++ aufrufen).

C++-Funktionen kann man aus C gar nicht aufrufen.

Autor: JAN (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach du Sch.... jetzt begreif' ich's! .C statt .c! Mit solchen 
Spitzfindigkeiten hat mich bisher noch kein Compiler beglückt. Danke für 
den Hinweis, ich wahr echt schon dem Wahnsinn nahe...

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg:

> Nein, das ist umgekehrt (C-Funktionen aus C++ aufrufen).

Klar, das auch.

> C++-Funktionen kann man aus C gar nicht aufrufen.

Doch natürlich kann man das. Vielleicht gehen wir auch nur von 
unterschiedlichen Definitionen von "C++-Funktion" aus. Für mich ist es 
eine Funktion, die in C++ implementiert wurde bzw. mit einem 
C++-Compiler übersetzt wurde. Die kann man durchaus auch von C aus 
aufrufen, sofern sie auf der C++-Seite als extern "C" deklariert wurde.
Du gehst wahrscheinlich eher von Funktionen mit "C++ linkage" aus.

@JAN:

> "Das heißt, dass du diese Funktion als C++ übersetzt hast statt als C"
>
> Aha, und wie habe ich das getan? Das war nämlich nicht mein Ansinnen.

Mir fallen dafür im Moment drei verschiedene Möglichkeiten ein:

- Du hast die Datei mit g++ statt gcc übersetzt. Dann wird sie
  automatisch als C++ interpretiert.

- Du hast mit gcc übersetzt, aber mit -x c++ als Kommandozeilenoption

- Du hast der Datei einen für C++-Dateien typischen Namen gegeben. gcc
  wählt die Sprache nämlich basierend auf der Endung des Dateinamens 
aus.
  Wenn da sowas wie z.B. .cpp, .C, .cxx, .cc angegeben ist, wird's als
  C++ übersetzt.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann war's wohl Fall 3 (und ich hab zu lange geschrieben). Du musst 
bedenken, dass gcc ein Compiler aus dem Un*x-Bereich ist, wo zwischen 
Groß- und Kleinschreibung unterschieden wird. Über die Sinnhaftigkeit, 
.C für C++-Code zu verwenden, lässt sich sicher streiten. Es ist eben 
historisch so gewachsen, und wird von gcc heute noch umgesetzt, da es 
durchaus noch Code gibt, bei dem diese Konvention verwendet wird.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus wrote:

>> C++-Funktionen kann man aus C gar nicht aufrufen.

> Du gehst wahrscheinlich eher von Funktionen mit "C++ linkage" aus.

Ja.  Jetzt habe ich auch verstanden, was du meinst.

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.