Frage

Wie hässlich wie win32 Microsoft-Compiler ist mit der __ declspec Makro, hat es den Vorteil hat, explizit zu sein, was Sie wollen oder nicht exportiert werden.

Das Verschieben den gleichen Code auf einem Linux Gnu / gcc-System bedeutet nun alle Klassen exportiert werden! (?)

Ist das wirklich wahr?

Gibt es eine Möglichkeit, um nicht eine Klasse innerhalb einer gemeinsam genutzten Bibliothek unter gcc zu exportieren?

#ifndef WIN32
#define __IMPEXP__
#else
#undef __IMPEXP__
#ifdef __BUILDING_PULSETRACKER__
#define __IMPEXP__ __declspec(dllexport)
#else
#define __IMPEXP__ __declspec(dllimport)
#endif // __BUILDING_PULSETRACKER__
#endif // _WIN32

class __IMPEXP__ MyClass
{
    ...
}
War es hilfreich?

Lösung

Dies ist möglich, in GCC 4.0 und höher. Die GCC-Leute betrachten diese Sichtbarkeit . Es gibt einen guten Artikel auf dem GCC Wiki über das Thema. Hier ist ein Ausschnitt aus diesem Artikel:

#if defined _WIN32 || defined __CYGWIN__
  #ifdef BUILDING_DLL
    #ifdef __GNUC__
      #define DLL_PUBLIC __attribute__((dllexport))
    #else
      #define DLL_PUBLIC __declspec(dllexport) // Note: actually gcc seems to also supports this syntax.
    #endif
  #else
    #ifdef __GNUC__
      #define DLL_PUBLIC __attribute__((dllimport))
    #else
      #define DLL_PUBLIC __declspec(dllimport) // Note: actually gcc seems to also supports this syntax.
    #endif
    #define DLL_LOCAL
#else
  #if __GNUC__ >= 4
    #define DLL_PUBLIC __attribute__ ((visibility("default")))
    #define DLL_LOCAL  __attribute__ ((visibility("hidden")))
  #else
    #define DLL_PUBLIC
    #define DLL_LOCAL
  #endif
#endif

extern "C" DLL_PUBLIC void function(int a);
class DLL_PUBLIC SomeClass
{
   int c;
   DLL_LOCAL void privateMethod();  // Only for use within this DSO
 public:
   Person(int _c) : c(_c) { }
   static void foo(int a);
};

Andere Tipps

Wenn eine Klasse nicht verfügbar sein sollte, sollte es nicht in einem öffentlichen Header sein. Was ist der Sinn des Teilens Erklärungen der Dinge der Benutzer nicht verwenden kann?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top