有一个开源的代码库,她是在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请问高手,这个问题该如何解决?我很着急,恳请帮忙

解决方案 »

  1.   

    到处要加__declspec(dllexport)而不是__declspec(dllimport),在这个DLL中用X_DLLEXPORT,这样exe和dll可以共用头文件。
    你能否帖一个最简单的派生的例子,并把错误信息帖上。
      

  2.   

     据我所知,导出类的dll应该使用静态连接方式编连其lib文件,你把该lib文件加入工程了么?
      

  3.   

    我把原来库导出的lib加入了我的工程,所以报错我才觉得不知如何处理,原来库所有的类都采用X_DLLEXPORT导出,也就是用__declspec(dllexport)导出了,但为何其中的静态成员,我现在如果要继承或使用,就报链接错误,说找不到父类中那个静态的对象,这该怎么办?
      

  4.   

    首先我不建议直接导出类,最好先定义一个接口纯虚类,然后把真实的类继承这个类,然后用函数分配类对象,返回纯虚类对象至于你的问题,怀疑你真没定义这个静态对象,否则lib里应该有它定义
      

  5.   

    使用DLL时出现unresolved symbol主要是由于未导入Lib文件的。
      

  6.   

    问题解决了,错误在于,我在导出我定义的类时也采用了X_EXPORT这个关键字,把它换为__declspec(dllexport),就正常编译通过了,呵呵
      

  7.   

    ossim 很好很强大。 不过也是问题多多,前天我才修正了一个BUG,编译好了还要慢慢调试。