2009-10-28 274 views
4

與win32一樣醜陋微軟編譯器通過使用宏,它確實具有明確你想要導出或不導出的好處。不與共享庫共享所有類

移動相同的代碼到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 
{ 
    ... 
} 

回答

11

這在GCC 4.0及更高版本中是可行的。 GCC的人認爲這知名度。關於這個問題,GCC維客有一個很好的article。下面是該文章的一個片段:

#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); 
}; 
0

如果一個類不應該是可用的,它不應該在公共頭。共享用戶不能使用的東西的聲明有什麼意義?

+0

甚至沒有符號定義只能在cpp文件仍然可以訪問,但?我想我可以在自己的頭文件中'模擬'一個聲明來訪問它們,即使它不是DLL作者的意圖。 – 2009-10-28 16:38:02

+1

@Matthieu:在這種情況下,你搞砸了,而不是圖書館的作者。在一個擁有優秀人才的經營良好的商店裏,不能也不應該這樣做? – 2009-10-28 16:49:45

+0

@David Thornley:評論中的第二句話是寶石! – 2010-02-03 15:43:07