НЕ делить все классы с общей библиотекой - PullRequest
5 голосов
/ 28 октября 2009

Несмотря на то, что компилятор Microsoft win32 уродлив с использованием макроса __declspec , он имеет то преимущество, что явно указывает, что вы хотите экспортировать или нет.

Перемещение того же кода в систему Linux gnu / gcc теперь означает, что все классы экспортированы! (?)

Это правда?

Есть ли способ НЕ экспортировать класс в общей библиотеке в gcc?

#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
{
    ...
}

Ответы [ 2 ]

13 голосов
/ 28 октября 2009

Это возможно в GCC 4.0 и более поздних версиях. Люди GCC считают это видимостью . Есть хорошая статья на вики GCC на эту тему. Вот фрагмент из этой статьи:

#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);
};
1 голос
/ 28 октября 2009

Если класс не должен быть доступен, он не должен быть в публичном заголовке. Какой смысл делиться объявлениями того, что пользователь не может использовать?

...