@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 を定義します。(ビルドシステムから制御できるように、コンパイラのフラグでこれを行うことができます)
ライブラリの静的バージョンをビルドするには、MYLIB_DLL を定義しないでください。
@アップデート:
これを拡張して、次のように GCC の可視性をサポートできます。
#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はとても正しいです。