C++的模板在DLL中发布出来,为什么外部调用就会报链接错误呢?

良少
博客专家认证
2008-01-08 11:07:33
我用的是VC2005,在一个dll项目中编写了一个模板类,所有的定义都在.h文件中定义。
然后把它发布出来。
我把它编译成dll,然后在一个外部项目中引入这个dll库和这个.h文件。
当我写ObjectRefManage<Error>* pObjectRefManage=0;
时是可以编译通过的。
但当我写pObjectRefManage=new ObjectRefManage<Error>();
时,就报出链接错误。

这是为什么呢? 我看网上有人说,模板不能在dll中发布。 但是,STL也是作为dll发布的。
...全文
224 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ltc_mouse 2008-01-08
  • 打赏
  • 举报
回复
模板就放在导出的.h头文件中可以吗?即编译dll和编译TestMain时都包含这个带模板的.h文件
良少 2008-01-08
  • 打赏
  • 举报
回复
如果我把模板类放在外部,确实可以编译通过。
但是,如果我的dll需要使用呢?
1,模板需要使用我的dll的代码,也就是需要包括这个dll文件
2,dll外部也需要使用这个模板,那怎么办?
良少 2008-01-08
  • 打赏
  • 举报
回复
TestMain.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall net_sf_interfacecpp_core_lang::ObjectRefManage<class AClass>::ObjectRefManage<class AClass>(void)" (__imp_??0?$ObjectRefManage@VAClass@@@net_sf_interfacecpp_core_lang@@QAE@XZ),该符号在函数 _main 中被引用
TestMain.obj : error LNK2001: 无法解析的外部符号 "public: virtual long __thiscall net_sf_interfacecpp_core_lang::ObjectRefManage<class AClass>::addRef(void)" (?addRef@?$ObjectRefManage@VAClass@@@net_sf_interfacecpp_core_lang@@UAEJXZ)
TestMain.obj : error LNK2001: 无法解析的外部符号 "public: virtual long __thiscall net_sf_interfacecpp_core_lang::ObjectRefManage<class AClass>::release(void)" (?release@?$ObjectRefManage@VAClass@@@net_sf_interfacecpp_core_lang@@UAEJXZ)
TestMain.obj : error LNK2001: 无法解析的外部符号 "public: virtual void __thiscall net_sf_interfacecpp_core_lang::ObjectRefManage<class AClass>::setSingleton(void)" (?setSingleton@?$ObjectRefManage@VAClass@@@net_sf_interfacecpp_core_lang@@UAEXXZ)
TestMain.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: virtual __thiscall net_sf_interfacecpp_core_lang::ObjectRefManage<class AClass>::~ObjectRefManage<class AClass>(void)" (__imp_??1?$ObjectRefManage@VAClass@@@net_sf_interfacecpp_core_lang@@UAE@XZ),该符号在函数 "public: virtual void * __thiscall net_sf_interfacecpp_core_lang::ObjectRefManage<class AClass>::`scalar deleting destructor'(unsigned int)" (??_G?$ObjectRefManage@VAClass@@@net_sf_interfacecpp_core_lang@@UAEPAXI@Z) 中被引用
D:\vsProject\net_sf_interfacecpp\Debug\TestMain.exe : fatal error LNK1120: 5 个无法解析的外部命令
goodmrning 2008-01-08
  • 打赏
  • 举报
回复
帮顶
  • 打赏
  • 举报
回复
刚才说错了
cin cout是两个变量.所以能编译到lib中.
  • 打赏
  • 举报
回复
cin cout是一个实际的类,所以可以存在到lib中
模板不能编译.所以只能使用源码.
ouyh12345 2008-01-08
  • 打赏
  • 举报
回复
用lib发布stl的东西
a0002 2008-01-08
  • 打赏
  • 举报
回复
就是说实际上只能导出类。
a0002 2008-01-08
  • 打赏
  • 举报
回复
导出模板必须显式实例化。

http://topic.csdn.net/u/20080105/00/ec6695c7-24d5-41e3-ab1b-39674374e987.html
良少 2008-01-08
  • 打赏
  • 举报
回复
是的,VC2005不支持export这个关键字。
我在写一个C++的开源库,就是设计成dll形式发布的,不能把 所有的模板 放进去, 那可不行啊
healer_kx 2008-01-08
  • 打赏
  • 举报
回复
export关键字还不work呢, DLL导出类就是有很多局限, 你最好导出C接口,或者类接口.
taodm 2008-01-08
  • 打赏
  • 举报
回复
楼主,你在哪看见stl是(只)作为dll发布的?stl只有cin/cout这个标准输入输出流是放入dll/lib的,其它都是以源码形式发布的。
另外,dll导出类本来就水太深了,不要在上面多耗了,用标准C接口。
良少 2008-01-08
  • 打赏
  • 举报
回复
多谢各位 我是一个java程序员,最近业余在搞C++。 结贴了。
babyvox1999 2008-01-08
  • 打赏
  • 举报
回复
学习了
redleaves 2008-01-08
  • 打赏
  • 举报
回复
楼上的同学,无论DLL还是LIB都不能用来发布模板。模板注定了要用源代码形式发布。除非用BT的方式实现export。
ouyh12345 2008-01-08
  • 打赏
  • 举报
回复
楼上的很多大牛,已经强调过了,不要用dll发布stl的东西,用lib

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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