Library - DLL Zugriffsrechte unter gcc



  • Hallo c++ Community,

    momentan entwerfe ich eine Library, die aus vielen Dateien und Klassen besteht.

    Aus vielen Tutorials habe ich dabei herausbekommen, wie ich unter MSVC mit Hilfe von EXPORT (siehe platform_settings.h) bestimmte Methoden dem Benutzer der Library zugänglich mache. Alle Funktonen, die kein Export vor sich stehen haben, sind bei der mit MSVC erstellten DLL nicht von außen zugänglich.

    Wie aber mache ich das selbe mit dem GCC Compiler? Das Export-Define ist hier leer.

    Mein Ziel dabei ist, dass der Benutzer die meisten Klassen nicht von außerhalb der Library instanzieren darf und irgendwelchen Unfug damit treibt.

    platform_settings.h

    #ifndef PLATFORM_SETTINGS_H
    #define PLATFORM_SETTINGS_H
    
    	#if defined(_WIN32) || defined(WIN32)
    		#ifdef _MSC_VER   // Windows && MS Visual C
    			#if _MSC_VER < 1310	//Version < 7.1?
    				#pragma message ("Compiling with a Visual C compiler version < 7.1 (2003) has not been tested!")
    			#endif // Version > 7.1
    
    			#ifndef EXPORT
    				#ifdef DLL_EXPORTS
    					#define EXPORT __declspec(dllexport)
    					//#pragma message ("Defining EXPORT __declspec(dllexport)")
    				#else
    					#define EXPORT __declspec(dllimport)
    					//#pragma message ("Defining EXPORT __declspec(dllimport)")
    				#endif
    			#endif
    
    			#pragma warning( disable : 4996 ) 	// disable deprecation warnings
    			// #pragma warning( disable : 4250 )	// disable dominance warnings (Mult. Inher. + diamond)
    			// #pragma warning( disable : 4091 )	// disable typedef warning without variable declaration
    
    		#elif defined (__GNUC__)
    			#ifndef EXPORT
    				#define EXPORT //empty statement!
    			#endif
    
    		#else
    			#error Compiler could not be detected!
    		#endif
    
    	#elif defined(__linux__) || defined(linux) || defined(__linux)
    		#ifndef EXPORT
    			#define EXPORT  // empty!
    		#endif
    	#endif
    #endif
    

    RX64.h

    #ifndef RX64_H_
    #define RX64_H_
    
    #include "platform_settings.h"
    
    #ifdef __cplusplus
    extern "C"
    {
    #endif
    
    class RX64
    {
    public:
    
    	RX64();
    	virtual ~RX64();
    
    	EXPORT int GetValue();   // soll exportiert werden!
    	EXPORT bool setValue(bool en);	EXPORT int GetValue();   // soll exportiert werden!
    
    	bool interneFunktion();	// soll nicht von außen, sondern nur innerhalb der Lib zugaenglich sein!
    
    private: 	
    	RX64(); // disable external usage of the standard constructor // soll auch nicht von außen zugaenglich sein!
    	RX64(const RX64&); // disable external usage of the copy Constructor
    	RX64& operator=(const RX64); // disable external usage of the assignment Operator
    };
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif //RX64_H_
    

    Noch eine Frage: Wenn ich die Code-Completion meines Testprogrammes benutze, sehe ich alle internen Variablen, die in den Headern definiert sind. Wie verhindere ich das?

    Viele Grüße

    Martin



  • Da dies recht eindeutig dem Thema "Compiler" zuzuordnen ist wirds verschoben 🙂



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Nach weiteren zwei Tagen googlen bin ich auf die richtigen Seiten gestoßen:

    http://gcc.gnu.org/wiki/Visibility

    Wenn man aber mit Boost arbeitet, kommt es zu problemen, da Boost den gcc compilerschalter -fvisbility=hidden noch nicht unterstützt. Meine Fehlermeldungen dazu (damit man den Thread hier bei google auch findet 😉 )

    ..\..\common\lib\boost_1_39_0/boost/noncopyable.hpp: In constructor 'boost::noncopyable_::noncopyable::noncopyable()':
    ..\..\common\lib\boost_1_39_0/boost/noncopyable.hpp:24: warning: visibility attribute not supported in this configuration; ignored

    ... wenn eine Klasse von noncopyable erbt. Dann noch ganz oft die Warning:

    warning: visibility attribute not supported in this configuration; ignored

    Mehr dazu:

    http://lists.boost.org/Archives/boost/2008/12/145773.php

    Das soll aber in Zukunft gefixed werden:

    https://svn.boost.org/trac/boost/ticket/2114

    Hat das zufällig schon jemand von euch gemacht? Ich bekomme das patchen nicht hin 😞


Anmelden zum Antworten