Forum: Compiler & IDEs Compiler erzeugt fehlerhaftes Objektfile


von JAN (Gast)


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?

von Peter S. (psavr)


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

von JAN (Gast)


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

von Karl heinz B. (kbucheg)


Lesenswert?

JAN wrote:
> Ich habe diesmal alle Files mal beigfügt.

Leider nicht.

von Rolf Magnus (Gast)


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.

von JAN (Gast)


Angehängte Dateien:

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von JAN (Gast)


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

von Rolf Magnus (Gast)


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.

von Rolf Magnus (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

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.