還有比@Wakely更好的方法。像這樣做:
#ifdef MYLIB_DLL
#ifndef MYLIB_IFACE
#ifdef MYLIB_IFACE_EXPORT
#define MYLIB_IFACE _declspec(dllexport)
#else // !MYLIB_IFACE_EXPORT
#define MYLIB_IFACE _declspec(dllimport)
#endif // !MYLIB_IFACE_EXPORT
#endif // !MYLIB_IFACE
#else // !MYLIB_DLL
#ifndef MYLIB_IFACE
#define MYLIB_IFACE
#endif // !MYLIB_IFACE
把這樣的一個塊是在DLL中使用的每一個文件頭,併爲您的DLL公共頭。
應該從您的DLL導出每一個符號被標記的是這樣的:
class MYLIB_IFACE MyClass
{
};
void MYLIB_IFACE myFunc();
然後在你的DLL的每個.cpp文件的第一行應該是:
#define MYLIB_IFACE_EXPORT
如果你這樣做這個,那麼它將在不使用dllexport/dllimport的POSIX系統上構建得很好。爲了構建你的lib的dll版本,你需要定義MYLIB_DLL。 (你可以在編譯器的標記中這樣做,以便可以從你的編譯系統中進行控制)
要構建lib的靜態版本,請不要定義MYLIB_DLL。
@Update:
您可以擴展這種支持GCC visilibity這樣的:
#ifdef WIN32
#define KX_SYMBOL_EXPORT _declspec(dllexport)
#define KX_SYMBOL_IMPORT _declspec(dllimport)
#else // GCC
#define KX_SYMBOL_EXPORT __attribute__((visibility ("default")))
#define KX_SYMBOL_IMPORT
#endif
#ifdef KX_DLL
#ifndef KX_IFACE
#ifdef KX_IFACE_EXPORT
#define KX_IFACE KX_SYMBOL_EXPORT
#else // !KX_IFACE_EXPORT
#define KX_IFACE KX_SYMBOL_IMPORT
#endif // !KX_IFACE_EXPORT
#endif // !KX_IFACE
#else // !KX_DLL
#ifndef KX_IFACE
#define KX_IFACE
#endif // !KX_IFACE
#endif // !KX_DLL
我刪除了GCC位在第一個例子中的簡單。但這是真的如何做到這一點。 @Wakely是如此的正確。
在宏調用之前或之後,您遇到語法錯誤。如果沒有看到更多的上下文,就無法分辨究竟是什麼 – Mat
你能舉一個你如何使用這個'CLASS'宏的例子嗎?也許這是一個簡單的使用錯誤? –
你可以在這個用法上方顯示代碼嗎? –