Hallo, ich habe eine kleine Library (.a) gebaut, in der es eine Funktion ISR_RESET gibt (definiert im .cpp File, deklariert im .hpp). Wenn ich diese .a-Library nun zu einem anderen Projekt dazulinke und als Entrypoint im Linkerscript nun diese ISR_RESET angebe, so sagt der Linker: warning: cannot find entry symbol ISR_RESET; not setting start address Die Funktion ist aber definitiv im Headerfile deklariert, ich könnte sie zum Beispiel auch aus main heraus aufrufen. Warum kommt dieser Fehler? Grüße
Selbst wenn ich in main.cpp die Funktion ISR_RESET definiere, kommt die Fehlermeldung. Nehme ich aber main als EntryPoint (also auch im Linkerscript) dann geht es. Der Unterschied liegt somit doch nur im Namen.
Leopold N. schrieb: > ISR_RESET gibt (definiert im .cpp File, deklariert im .hpp) Für C++ bekommt der Namen noch eine "Dekoration" für die Parameter, daher findet der Linker das Symbol nicht. Abhilfe ist: extern "C" { } Damit wird das Symbol C-konform deklariert. Und ja, die Compiler schalten automagisch in C++ Modus wenn die Source Datei eine .cpp Endung trägt.
Du musst den mangled Name bzw. Assembler-Name der Funktion angeben. Wie der genau ist hängt von der Linkage ab. Weiterhin: 1) Das Symbol muss externally visible sein (insbesondere also global). 2) Es muss ein Symbol sein. Bezeichner wie "ISR_RESET" bezeichnen üblicherweise Makros. Wenn dem so ist musst du natürlich den wirlichen Name der Funktion verwenden. 3) Der Assembler-Name kann sich selbst bei C ein andere sein als Der Funktionsname, z.B. wie bei x86 üblichem Leading Underscore.
Vielen Dank, Name Mangling... ich komm mir vor wie n Anfänger... Hab den ganzen Tag damit verplempert. Extern C hat alles geregelt... Grüße
Aber noch zwei kurze Anmerkungen: Leopold N. schrieb: > Die Funktion ist aber definitiv im Headerfile deklariert, ich könnte sie > zum Beispiel auch aus main heraus aufrufen. Dem Linker ist der Header völlig egal. Im Übrigen hattest du mit nm oder objdump nachschauen können, was für Symbole sich in deinem Archiv so finden.
Rolf M. schrieb: > Im Übrigen hattest du mit nm oder objdump nachschauen können, was für > Symbole sich in deinem Archiv so finden. Gut zu wissen, danke.
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.