不与共享库共享的所有类(NOT sharing all classes with shared li

2019-09-01 23:43发布

丑如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
{
    ...
}

Answer 1:

这是可能在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);
};


Answer 2:

如果一个类不应该用,它不应该是一个公共头。 什么是共享的东西,用户无法使用声明的地步?



文章来源: NOT sharing all classes with shared library