导出类的虚内联函数产生LNK2001错误

EasyTDD 2009-07-07 04:58:58
我的代码使用了一个第三方库,其中有一些导出类中包含虚内联函数如:
class AFX_EXT_CLASS CBase
{
virtual void OnStop(){};
}

class AFX_EXT_CLASS CType
{
virtual void OnStop();
}

链接时会产生LNK2001错误,CBase::OnStop和CType::OnStop是不可解析的外部符号,如果自己加一个定义,又会产生函数体已定义的编译错误,哪些大侠知道如何解决?非常感谢!
...全文
129 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
EasyTDD 2009-10-23
  • 打赏
  • 举报
回复
看来找不到解决办法,谢谢各位!
gg606 2009-07-15
  • 打赏
  • 举报
回复
更正一下:

在你#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);




Treazy 2009-07-15
  • 打赏
  • 举报
回复
把第三方的库的路径指定到你的工程中
并将此这个lib连接到你的工程中
gg606 2009-07-15
  • 打赏
  • 举报
回复
你是怎么用的呢?

在你#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,不能用对象。这个你应该知道的吧?

(有些细节记不清了,应该是这样的。)
WooSir 2009-07-14
  • 打赏
  • 举报
回复
没深入研究过,不过同意4楼
如果你想在派生类中实现这些虚函数功能,用纯虚函数吧,不用实现代码。
否则这些虚函数还是不要在头文件内实现,看看MFC有没有你这种做法就知道了。
估计编译器都不知道是先调用派生类的虚函数,还是调用基类的内联虚函数。如果可行,呵呵,希望广而告之。
捕鲸叉 2009-07-14
  • 打赏
  • 举报
回复
内联函数怎么可以导出呢?假如可以导出,调用者到哪去找函数体的地址呢?
zhouzhipen 2009-07-07
  • 打赏
  • 举报
回复
可能是没有LIB吧
  • 打赏
  • 举报
回复
学习
oyljerry 2009-07-07
  • 打赏
  • 举报
回复
virtual void OnStop(){}
不要引号
wangk 2009-07-07
  • 打赏
  • 举报
回复
头文件里没有实现的,lib文件里面必须有实现。
虚函数的话可以自己派生一个类,实现之。

另空的内联虚函数标准写法不是楼上的写法吧?

virtual void OnStop(){};

应该是没有;号的。
virtual void OnStop(){}
bragi523 2009-07-07
  • 打赏
  • 举报
回复
继承下试试
dong364 2009-07-07
  • 打赏
  • 举报
回复
缺少lib, 还有少了分号
greatws 2009-07-07
  • 打赏
  • 举报
回复
一般没有这样用的吧,哪有又导出,又内联的,实现不是全被别人看到了?

既然是接口,那用纯虚函数试试。
EasyTDD 2009-07-07
  • 打赏
  • 举报
回复
to wangk: 头文件里有实现的,第一个类已写了实现,第二个类没写,发贴时漏了。应该是这样的:
class AFX_EXT_CLASS CBase
{
virtual void OnStop(){};
}

class AFX_EXT_CLASS CType
{
virtual void OnStop(){};
}
wangk 2009-07-07
  • 打赏
  • 举报
回复
内联函数?不是吧?实现呢?头文件里根本没有,不出问题才怪。

把实现和声明一起挪到.h里吧。
晨星 2009-07-07
  • 打赏
  • 举报
回复
也想知道,帮你顶。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧