我的代码使用了一个第三方库,其中有一些导出类中包含虚内联函数如:
class AFX_EXT_CLASS CBase
{
    virtual void OnStop(){};
}class AFX_EXT_CLASS CType
{
    virtual void OnStop();
}链接时会产生LNK2001错误,CBase::OnStop和CType::OnStop是不可解析的外部符号,如果自己加一个定义,又会产生函数体已定义的编译错误,哪些大侠知道如何解决?非常感谢!

解决方案 »

  1.   

    to wangk: 头文件里有实现的,第一个类已写了实现,第二个类没写,发贴时漏了。应该是这样的:
    class AFX_EXT_CLASS CBase 

        virtual void OnStop(){}; 
    } class AFX_EXT_CLASS CType 

        virtual void OnStop(){}; 
      

  2.   

    头文件里没有实现的,lib文件里面必须有实现。
    虚函数的话可以自己派生一个类,实现之。另空的内联虚函数标准写法不是楼上的写法吧?virtual void OnStop(){}; 应该是没有;号的。
    virtual void OnStop(){}
      

  3.   

    virtual void OnStop(){}
    不要引号
      

  4.   

    没深入研究过,不过同意4楼
    如果你想在派生类中实现这些虚函数功能,用纯虚函数吧,不用实现代码。
    否则这些虚函数还是不要在头文件内实现,看看MFC有没有你这种做法就知道了。
    估计编译器都不知道是先调用派生类的虚函数,还是调用基类的内联虚函数。如果可行,呵呵,希望广而告之。
      

  5.   

    你是怎么用的呢?在你#include的头文件里可不能再如下声明: 
    class AFX_EXT_CLASS CBase 

        virtual void OnStop(){}; 
    } class AFX_EXT_CLASS CType 

        virtual void OnStop(); 
    } 而是这样: 
    class CBase 

        virtual void OnStop(){}; 
    } class CType 

        virtual void OnStop(); 

    就可以了。
    当然使用这两个类的时候必须用指针new,不能用对象。这个你应该知道的吧?(有些细节记不清了,应该是这样的。)
      

  6.   

    把第三方的库的路径指定到你的工程中
    并将此这个lib连接到你的工程中
      

  7.   

    更正一下:在你#include的头文件里要如下声明: 
    class AFX_EXT_CLASS CBase 

        virtual void OnStop(); 
    } class AFX_EXT_CLASS CType 

        virtual void OnStop(); 
    } 用这种方法导出类,调用方使用时是一种介于显示和隐式之间的方式,即:要包含头文件,却不需引入库(.lib)。
    但提供dll的一方同时应该提供全局的或友元的动态创建和销毁类对象的函数(看看有没有?)。调用方法大致如下:
    LoadLibrary("");
    pCreateInstance = GetProcessAddress(...);
    pDelInstance = GetProcessAddress(...);
    CType *ptype = pCreateInstance(...);
    ptype->Stop();
    ......
    pDelInstance (ptype);