Forum: Mikrocontroller und Digitale Elektronik .h .s in c++ inkludieren


von Jörg (Gast)


Lesenswert?

Hallo,

habe ich ein Linkerproblem?

ich habe eine Bibliothek mit Flash Schreibbefehlen in einer 
Flash.s+Flash.h Datei.

Beim Übersetzen meines Projektes wird diese Bibliothek scheinbar korrekt 
übersetzt, die Flash.o+Flash.d Dateien werden erzeugt.

Wenn ich jedoch die Header Datei in meinem C++ Projekt includiere, kann 
ich die Funktionen jedoch nicht verwenden (undefined reference) ,z.B:
1
#include "Flash.h"
2
3
Flash_WaitForSPM() ;

-->
1
.global Flash_WaitForSPM    
2
3
Flash_WaitForSPM:
4
  lds  r18, NVM_STATUS          ; Load the NVM Status register.
5
  sbrc  r18, NVM_NVMBUSY_bp    ; Check if bit is cleared.
6
  rjmp  Flash_WaitForSPM      ; Repeat check if bit is not cleared.
7
  clr  r18
8
  sts  NVM_CMD, r18            ; Clear up command register to NO_OPERATION.
9
  ret

Vielen dank!

von Klaus (Gast)


Lesenswert?

Das liegt am "Name mangling" von C++.

Das ist eine spezielle Art die Funktionen auf Assemblerebene zu 
benennen.

Das Assemblerfile wird demzufolge für einen C-Compiler gedacht sein.

von Istvan (Gast)


Lesenswert?

Versuch mal die Funktion im .h File als extern "C" zu deklarieren.

von Sebastian V. (sebi_s)


Lesenswert?

Um das Name Mangling loszuwerden in der Header Datei ein
1
#ifdef __cplusplus
2
 extern "C" {
3
#endif
4
5
// Funktionsdeklarationen hier
6
7
#ifdef __cplusplus
8
 }
9
#endif
hinzufügen.

von Jörg (Gast)


Lesenswert?

Istvan schrieb:
> Versuch mal die Funktion im .h File als extern "C" zu deklarieren.

Sebastian V. schrieb:
> Um das Name Mangling loszuwerden in der Header Datei ein#ifdef
> __cplusplus
>  extern "C" {
> #endif
>
> // Funktionsdeklarationen hier
>
> #ifdef __cplusplus
>  }
> #endifhinzufügen.

Danke, das hat geholfen!

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.