Compiler erzeugt fehlerhaftes Objektfile

Gast #448432
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?
#448436
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
Gast #448451
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
Gast #448463
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.
Gast #448470
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...
Angehängte Dateien:
Gast #448483
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.
Gast #448485
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.

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