Forum: Mikrocontroller und Digitale Elektronik Symbole aus Lib werden nicht gefunden


von A. B. (funky)


Lesenswert?

Hi,

ich benutze Keil 5 armcc und binde eine vorkompilierte Library ein

Leider kommt es dabei zu folgendem Problem:
1
linking...
2
STM32H745I_DISCO_CM7\Exe\STM32H745I_DISCO_CM7.axf: Error: L6218E: Undefined symbol util_threadBD_create (referred from I_S2C_suite.o).
3
STM32H745I_DISCO_CM7\Exe\STM32H745I_DISCO_CM7.axf: Error: L6218E: Undefined symbol volumeFader__register_cmd_callback (referred from SAP.o).
4
Not enough information to produce a FEEDBACK file.
5
Not enough information to list image symbols.
6
Not enough information to list load addresses in the image map.
7
Finished: 3 information, 0 warning and 2 error messages.
8
"STM32H745I_DISCO_CM7\Exe\STM32H745I_DISCO_CM7.axf" - 2 Error(s), 2 Warning(s).
9
10
*** Performing Cross-Module-Optimization:
11
*** Feedback file 'STM32H745I_DISCO_CM7\Exe\STM32H745I_DISCO_CM7.fed' not found.
12
Target not created.

Der Ersteller der Lib sagt mir:
So ist die eine Funktion definiert (geht nicht)
1
int util_threadBD_create(***, void *threadCode(void*), ***, ***, ***);
und so würde es testweise gehen und der Linker meckert nicht
1
int util_threadBD_create(***, void *threadCode, ***, ***, ***);


Irgendwie scheint da etwas mit diesem Funktionspointer mit Parameter 
nicht zu passen. Muss man da bei einer Library irgendwas beachten und 
etwas anders angeben bzw irgendwelche Flags aktivieren? Ich hatte solche 
Probleme bisher noch nicht mit anderen Libs. Die kann ich ohne Probleme 
einbinden

Schaue ich in mein Map File sehe ich da:
1
util_threadBD.o(.ARM.exidx) refers to util_threadBD.o(i._Z20util_threadBD_createPPvPFS_S_ES_PKci) for i._Z20util_threadBD_createPPvPFS_S_ES_PKci 
2
3
Removing util_threadBD.o(i._Z20util_threadBD_createPPvPFS_S_ES_PKci), (4 bytes)
4
5
volumeFader.o(.ARM.exidx) refers to volumeFader.o(i._Z34volumeFader__register_cmd_callbackPcPFiPKcPvES2_) for i._Z34volumeFader__register_cmd_callbackPcPFiPKcPvES2_
6
7
Removing volumeFader.o(i._Z34volumeFader__register_cmd_callbackPcPFiPKcPvES2_), (20 bytes).


Ich hab eigentlich zwei Fragen:
weiß jemand was da die Ursache sein könnte und was da schiefläuft?


Und b)
andere Funktionen sehen im Map so aus:
1
 volumeFader.o(.ARM.exidx) refers to volumeFader.o(i.volumeFader__set_enable) for i.volumeFader__set_enable
ohne dieses ganze zufällig Buchstabenzeugs (was mich an Namemangeling 
erinnert aber hier bei c-Code ja nicht der Fall ist)
Wo kann ich denn mehr über solche Details und zusammenhänge lesen was da 
genau passiert? Ich bin gerade ein wenig überfragt wei ich diese Infos 
genau bewerte die mir das Map File da gibt

Danke für Erleuchtung

von Harry L. (mysth)


Lesenswert?

Es gibt mit ziemlicher Sicherhheit eine Header-Datei in der der 
Funktions-Prototyp für util_threadBD_create definiert ist.

Hast du die auch eingebunden?

von A. B. (funky)


Lesenswert?

ne, das sind irgendwelche internen Funktionen die ich nicht in meinem 
Header habe

von MaWin (Gast)


Lesenswert?

Harry L. schrieb:
> Hast du die auch eingebunden?

Hast du den Eingangspost überhaupt gelesen?

A. B. schrieb:
> ohne dieses ganze zufällig Buchstabenzeugs (was mich an Namemangeling
> erinnert aber hier bei c-Code ja nicht der Fall ist)

Bist du dir denn sicher, dass du deinen C-Code auch mit einem C-Compiler 
übersetzt? Oder Compilierst du dein C-Programm (vielleicht unbewusst) 
mit einem C++-Compiler?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

A. B. schrieb:
> util_threadBD.o(i._Z20util_threadBD_createPPvPFS_S_ES_PKci)

Das ist definitiv C++ Name Mangling. Wahrscheinlich hat der Lib-Autor 
die eine Datei mit C und die andere mit C++ kompiliert und das 'extern 
"C"' vergessen. Das fällt erst bei dir auf, weil ja beim Erstellen der 
Library nicht gelinkt wird.

von A. B. (funky)


Lesenswert?

ok, werde nochmal mit denen sprechen.

ich benutze definitiv den c-compiler (Keil hat auch einen c++ Compiler, 
aber der kommt hier nicht zum Einsatz)

Danke schonmal

von Bertmar (Gast)


Lesenswert?

Niklas G. schrieb:
> Das ist definitiv C++ Name Mangling.

Zur Compiler-Toolchain sollte ein Tool gehören, mit dem man die von 
einer Objektdatei oder Library exportierten Symbole ausgeben lassen 
kann.

Das und dessen Ausgabe sollte man dem Ersteller der Library vorlegen.

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.