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?
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
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
JAN wrote:
> Ich habe diesmal alle Files mal beigfügt.
Leider nicht.
> 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.
"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...
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.
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...
@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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.