C++ 不与共享库共享所有类
通过使用\uuu declspec宏,win32 Microsoft编译器虽然难看,但它的优点是可以明确说明您想要导出什么或不想要导出什么 将相同的代码移动到LinuxGNU/gcc系统现在意味着导出所有类!(?) 这是真的吗 有没有办法不导出gcc下共享库中的类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
#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
?在哪种情况下需要禁用此宏?它对静态库没有影响。。。?