有一个开源的代码库,她是在linux平台下开发的,很庞大,我想把她裁剪一下,只取其核心部分,因为她是以动态链接库的形式发布的,所以在定义DLL时有个定义如下:
#if defined(__MINGW32__) || defined(__CYGWIN__) || defined(_MSC_VER) || defined(__VISUALC__) || defined(__BORLANDC__) || defined(__WATCOMC__)
# define X_EXPORT __declspec(dllexport)
# define X_IMPORT __declspec(dllimport)
# ifdef X_MAKINGDLL
# define X_DLLEXPORT X_EXPORT
# define X_DLL X_EXPORT
# define X_DLLEXPORT_DATA(type) X_EXPORT type
# define X_DLL_DATA(type) X_EXPORT type
# define X_DLLEXPORT_CTORFN
# else
# define X_DLLEXPORT X_IMPORT
# define X_DLL X_IMPORT
# define X_DLLEXPORT_DATA(type) X_IMPORT type
# define X_DLL_DATA(type) X_IMPORT type
# define X_DLLEXPORT_CTORFN
# endif
#else /* not #if defined(_MSC_VER) */
# define X_EXPORT
# define X_IMPORT
# define X_DLLEXPORT
# define X_DLL
# define X_DLLEXPORT_DATA(type) type
# define X_DLL_DATA(type) type
# define X_DLLEXPORT_CTORFN
#endif /* #if defined(_MSC_VER) */
那么在编译这个库时,我只要定义了X_MAKINGDLL,就可以正常编译通过并生成相应的dll,可问题是当我要从这个库的某个类派生出一个类时,这个库中的所有类都有一个成员变量TYPE_DATA,而且这个成员包含静态的对象和函数,还必须继承才行,因为要实现运行时类型信息识别,其定义如下:
#define TYPE_DATA \
protected: \
static const RTTITypeinfo RTTI_obj; \
static void* RTTI_scast(int,void*); \
static void* RTTI_new(); \
public: \
virtual RTTItypeid RTTI_vinfo() const { return &RTTI_obj; }\
static RTTItypeid RTTI_sinfo() { return &RTTI_obj; }\
virtual void* RTTI_cast(RTTItypeid);\
virtual const void* RTTI_cast(RTTItypeid)const;其中 RTTITypeinfo 和 RTTItypeid 分别是也采用X_DLLEXPORT 导出的类,我遇到的问题:
我从这个库的类继承并定义了自己的类后,因为要继承TYPE_DATA,因为我这个继承的类也需要导出,所以在类前加上_declspec(dllexport),那么总是在链接时报错:
error LNK2001: unresolved external symbol .....一大堆,就是说找不到基类的对象,意思好象是基类的东西没有导出来给这个继承类
如果我在我的类前加上_declspec(dllimport),那么总是在链接时报错:
error C2491: 'XXXXX' : definition of dllimport static data member not allowed请问高手,这个问题该如何解决?我很着急,恳请帮忙
#if defined(__MINGW32__) || defined(__CYGWIN__) || defined(_MSC_VER) || defined(__VISUALC__) || defined(__BORLANDC__) || defined(__WATCOMC__)
# define X_EXPORT __declspec(dllexport)
# define X_IMPORT __declspec(dllimport)
# ifdef X_MAKINGDLL
# define X_DLLEXPORT X_EXPORT
# define X_DLL X_EXPORT
# define X_DLLEXPORT_DATA(type) X_EXPORT type
# define X_DLL_DATA(type) X_EXPORT type
# define X_DLLEXPORT_CTORFN
# else
# define X_DLLEXPORT X_IMPORT
# define X_DLL X_IMPORT
# define X_DLLEXPORT_DATA(type) X_IMPORT type
# define X_DLL_DATA(type) X_IMPORT type
# define X_DLLEXPORT_CTORFN
# endif
#else /* not #if defined(_MSC_VER) */
# define X_EXPORT
# define X_IMPORT
# define X_DLLEXPORT
# define X_DLL
# define X_DLLEXPORT_DATA(type) type
# define X_DLL_DATA(type) type
# define X_DLLEXPORT_CTORFN
#endif /* #if defined(_MSC_VER) */
那么在编译这个库时,我只要定义了X_MAKINGDLL,就可以正常编译通过并生成相应的dll,可问题是当我要从这个库的某个类派生出一个类时,这个库中的所有类都有一个成员变量TYPE_DATA,而且这个成员包含静态的对象和函数,还必须继承才行,因为要实现运行时类型信息识别,其定义如下:
#define TYPE_DATA \
protected: \
static const RTTITypeinfo RTTI_obj; \
static void* RTTI_scast(int,void*); \
static void* RTTI_new(); \
public: \
virtual RTTItypeid RTTI_vinfo() const { return &RTTI_obj; }\
static RTTItypeid RTTI_sinfo() { return &RTTI_obj; }\
virtual void* RTTI_cast(RTTItypeid);\
virtual const void* RTTI_cast(RTTItypeid)const;其中 RTTITypeinfo 和 RTTItypeid 分别是也采用X_DLLEXPORT 导出的类,我遇到的问题:
我从这个库的类继承并定义了自己的类后,因为要继承TYPE_DATA,因为我这个继承的类也需要导出,所以在类前加上_declspec(dllexport),那么总是在链接时报错:
error LNK2001: unresolved external symbol .....一大堆,就是说找不到基类的对象,意思好象是基类的东西没有导出来给这个继承类
如果我在我的类前加上_declspec(dllimport),那么总是在链接时报错:
error C2491: 'XXXXX' : definition of dllimport static data member not allowed请问高手,这个问题该如何解决?我很着急,恳请帮忙
你能否帖一个最简单的派生的例子,并把错误信息帖上。