Memberfunktionen in DLL nicht von außen sichtbar?



  • Möp,

    Ich bastle mir gerade eine Library, mit deren Hilfe man (Member-)Funktionen und Operatoren mit C++-Linkage laden können soll. Nun habe ich mir testweise eine Library programmiert, allerdings scheinen die Memberfunktionen nicht in der Library nach außen hin vorhanden zu sein. Mein Code sieht wie folgt aus:

    #define PUBLIC  __attribute__((visibility("default")))
    
    namespace foo
    {
    	namespace quuux
    	{
    		PUBLIC void bar()
    		{
    			std::cout << "Hello, World!\n";
    		}
    
    		struct baz
    		{
    			PUBLIC baz() {}
    
    			PUBLIC static void qux()
    			{
    				std::cout << "Hello, World!\n";
    			}
    
    			PUBLIC void quux()
    			{
    				std::cout << "Hello, World!\n";
    			}
    		};
    	}
    }
    

    Ich habe auch schon probiert, die Klasse als PUBLIC zu deklarieren, das hat ebenfalls nichts gebracht. Ich habe mir mit nm alle Symbole der Library ausgeben lassen:

    $ nm -g libtestdll
    0000000000000ed4 T __ZN3foo5quuux3barEv
    U __ZNSt8ios_base4InitC1Ev
    U __ZNSt8ios_base4InitD1Ev
    U __ZSt4cout
    U __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
    U ___cxa_atexit
    U dyld_stub_binder

    Wie man sieht, sind die Memberfunktionen nicht sichtbar.

    Kompiliert habe ich mit

    g++ -O0 -g3 -Wall -c -fmessage-length=0 -std=c++11 -fvisibility=hidden -fPIC -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.cpp"

    und gelinkt mit

    g++ -dynamiclib -o "libtestdll" ./main.o

    Hat jemand eine Idee?
    Grüße,
    PI



  • Hallo PI,

    lies dir mal den Absatz "dllexport" unter http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html durch.



  • Ich bin unter Mac OS X.



  • Keiner ne Idee?



  • Was ich gerade herausgefunden habe: Sobald ich eine Klasse in einer Funktion verwende, sind plötzlich alle Symbole da.

    #include <iostream>
    
    #define PUBLIC __attribute__((visibility("default")))
    
    struct foo
    {
    	PUBLIC virtual void baz()
    	{
    		std::cout << "foo::baz()\n";
    	}
    };
    
    struct bar : foo
    {
    	PUBLIC bar() {}
    
    	PUBLIC virtual void baz()
    	{
    		std::cout << "bar::baz()\n";
    	}
    };
    
    void foobarbaz()
    {
    	bar();
    }
    

    Symbole, die dann entstehen:

    $ nm -g libtestdll
    0000000000000dd2 T __ZN3bar3bazEv
    0000000000000daa T __ZN3barC1Ev
    0000000000000d6e T __ZN3foo3bazEv
    U __ZNSt8ios_base4InitC1Ev
    U __ZNSt8ios_base4InitD1Ev
    U __ZSt4cout
    U __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
    U __ZTVN10__cxxabiv117__class_type_infoE
    U __ZTVN10__cxxabiv120__si_class_type_infoE
    U ___cxa_atexit
    U dyld_stub_binder

    Sobald ich die Dummy-Funktion entferne, sind die Symbole wieder weg.


Anmelden zum Antworten