unresolved Symbols bei Shared Library



  • Hallo!

    Ich habe ein Problem mit einer Shared Library:
    Die Library verwendet eine Klasse die allerdings in dem Programm definiert ist, dass die Shared Library mit dlopen/dlsym läd. Dabei bekomme ich immer folgenden Fehler:

    error while loading shared libraries: plugins/libmp3plugin.so: undefined symbol: _ZN13CategoryTableC1ER8CategoryP7QWidgetPKcRK7QString

    Der Fehler lässt sich auf folgenden Library Code beschränken:

    #include "../categorytable.h"
    extern "C" CategoryTable * CreateCategory(QString Path, Category &NewCategory)
    {
    	CategoryTable *Result = new CategoryTable(NewCategory, 0, 0, "Mp3ID.xml");
    	return Result;
    }
    

    Erstellt wird das ganze wie folgt:

    gcc -fpic -DPIC -I/usr/include -I/usr/qt/3/include -c mp3plugin.cpp
    gcc -shared -o ../../plugins/libmp3plugin.so.1.0 -Wl,-export-dynamic,-soname,libmp3plugin.so.1 mp3plugin.o

    Soweit ich aus diversen Google Suchen festellen konnte, sollte das Problem eigentlich mit dem Flag "-export-dynamic" behoben werden können, dem ist aber leider nicht so.
    Ich kann den Fehler beheben, indem ich beim erstellen der Library alle Object Files meines Hauptprogrammes hinzufüge (damit also auch die Implementierung von der CategoryTable Klasse). Das bläht die Library aber natürlich unnötig auf, weil das ja eh schon in der ausführbaren Datei drin steht.

    Ich hoffe jemand hat eine Lösung oder falls noch Informationen fehlen, bitte kurz schreiben welche!

    Vielen Dank
    KaPtainCugel



  • Du kannst nicht Objects verschiedener G++-Versionen zusammenlinken (sprich: du musst mit dem gleichen Compiler compilieren, der auch für das Hauptprogramm verwenndet wurde).



  • Ist die Funktion im Header auch extern "C" deklariert? Und irgend wie scheint die Meldung eine andere Funktion zu meinen.

    Vielleicht solltest du mal mit nm das Symbol Table durchgucken.

    @Ringding
    quatsch. Es gibt einige G++ Versionen, die ABI inkompatibel sind, aber nicht jede neue Version hat eine neue ABI und vorallem nutzt er ja extern "C".



  • Ich weiß schon, dass einige kompatibel sind. Aber ich wollte jetzt nicht alle aufzählen (ich weiß es außerdem nicht auswendig). Mit der gleichen Version ist man jedenfalls auf der sicheren Seite.

    _ZN13CategoryTableC1ER8CategoryP7QWidgetPKcRK7QString schaut mir nicht unbedingt nach extern "C" aus.



  • Problem gelöst, rdynamic ist ein linker flag und nichts was ich bei der Kompilierung der cpp Dateien zu Object Dateien angeben muss...Jetzt klappt es auf jeden Fall, vielen Dank trotzdem für die Hilfe!


Log in to reply