有比@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。
@更新:
您可以扩展它以支持 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 是对的。