C++ 不与共享库共享所有类

C++ 不与共享库共享所有类,c++,linux,gcc,g++,shared-libraries,C++,Linux,Gcc,G++,Shared Libraries,通过使用\uuu declspec宏,win32 Microsoft编译器虽然难看,但它的优点是可以明确说明您想要导出什么或不想要导出什么 将相同的代码移动到LinuxGNU/gcc系统现在意味着导出所有类!(?) 这是真的吗 有没有办法不导出gcc下共享库中的类 #ifndef WIN32 #define __IMPEXP__ #else #undef __IMPEXP__ #ifdef __BUILDING_PULSETRACKER__ #define __IMPEXP__ __declsp

通过使用\uuu declspec宏,win32 Microsoft编译器虽然难看,但它的优点是可以明确说明您想要导出什么或不想要导出什么

将相同的代码移动到LinuxGNU/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
{
    ...
}

如果类不可用,则它不应位于公共标头中。共享用户不能使用的东西的声明有什么意义?

这在GCC 4.0及更高版本中是可能的。海湾合作委员会成员考虑这种能见度。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);
};

即使是仅在cpp文件中定义的符号也仍然可以访问吗?我想我可以在自己的头文件中“模拟”一个声明来访问它们,即使这不是DLL作者的意图。@Matthieu:在这种情况下,你搞错了,不是库作者。在一家经营良好、有能力的商店里,不能和不应该有什么区别?@David Thornley:你评论中的第二句话是一块宝石!是否需要
构建DLL
?在哪种情况下需要禁用此宏?它对静态库没有影响。。。?