跪求高手指点VC6.0切换VS2010遭遇问题:error C2491:definition of dllimport function not allowed

queeny789 2013-06-17 10:13:07
原本工程是VC6.0的,切换编译工程后,VS2010始终报错。
原始代码:
在.h文件中首先定义
#ifdef SNACCDLL_EXPORTS
#define SNACCDLL_API __declspec(dllexport)
#else
#define SNACCDLL_API __declspec(dllimport)

之后定义了一个类
template <class T> class SNACCDLL_API AsnSeqOf : public AsnList<T>
{
public:
SNACC::AsnLen BEnc (BUF_TYPE b);
void BDec (BUF_TYPE b, SNACC::AsnLen &bytesDecoded);
virtual SNACC::AsnType * Clone() const { return new AsnSeqOf<T>(*this); }
void Print(ostream &os) const;
void PrintXML(ostream &os, const char *lpszTitle=NULL) const;
};

报错是在定义类的函数BEnc时出现的。template <class T>
SNACC::AsnLen AsnSeqOf<T>::BEnc (BUF_TYPE b)
{
SNACC::AsnLen l;
l = BEncContent (b);
l += SNACC::BEncDefLen (b, l);
l += BEncTag1 (b, SNACC::UNIV, SNACC::CONS, SNACC::SEQ_TAG_CODE);
return l;
}

看了下工程下的代码,使用SNACCDLL_API定义的所有类中,成员函数有定义的都会报错。苦苦思索几天不得解,求高手指点。
...全文
429 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
橡木疙瘩 2013-06-17
  • 打赏
  • 举报
回复
dll工程编译生成的lib必须加到exe工程里 dll工程和exe工程中声明应该只有一点不同: DLL中:__declspec(dllexport) EXE中:__declspec(dllimport) Dll和EXE最好用同一个编译器编译
queeny789 2013-06-17
  • 打赏
  • 举报
回复
为了排除工程切换其他问题导致编译不过,我做删除函数定义,保留声明的操作是先在原来可用的VC6.0工程下操作的。这么修改后,现在VC6.0的也有链接问题,所以是Lib未加到工程中的可能行比较小。 跪求详解。。。。
橡木疙瘩 2013-06-17
  • 打赏
  • 举报
回复
链接时把编译dll时生成的lib加到工程中。
queeny789 2013-06-17
  • 打赏
  • 举报
回复
我试过删除这种成员函数的定义,build之后会产生链接错误:Tlv2Asn.obj : error LNK2001: unresolved external symbol "public: virtual unsigned int __thiscall AsnSetOf<class SNACC_ETSI_X2::PartyInformation>::BEnc(class AsnBuf &)" (?BEnc@?$AsnSetOf@VPartyInformation@SNACC_ETSI_X2@@@@UAEIAAVAsnBuf@@@Z) 好像是说AsnSetOf::BEnc没有定义。 我也试过把定义类时的SNACCDLL_API删除,修改成下面的样子,同样是一堆的链接错误: template <class T> class AsnSeqOf : public AsnList<T>
橡木疙瘩 2013-06-17
  • 打赏
  • 举报
回复
既然你已经声明为import了,那么函数代码就应该是在dll中,有声明就足够了,不应该再有函数定义。
橡木疙瘩 2013-06-17
  • 打赏
  • 举报
回复
__declspec(dllimport)只能用于声明不能用于定义。 声明: __declspec(dllimport) fun(); 定义: __declspec(dllimport) fun(){//do something}
queeny789 2013-06-17
  • 打赏
  • 举报
回复
那现在问题就是: 1、工程里使用dllimport,但事实上DLL中不存在对应函数,报错的类AsnSeqof是继承的自己的类AsnList。所以删除类中成员函数的定义后链接错误。 2、报错的类需要写成类模板,所以把类搞成dllexport也不对。 不知道原来VC6.0的时候这段代码怎么就行。杯具。 。。。。。苍天啊,码农之殇,跪求哪位高人指点迷津。
短歌如风 2013-06-17
  • 打赏
  • 举报
回复
类模板是不能从DLL中export出来的,能export出来的只有具体的类,或是类模板某一实例。
queeny789 2013-06-17
  • 打赏
  • 举报
回复
哦,我刚才没回答清楚。我是说工程里已经包含需要的lib。 VC的这个工程包含是开源的代码SNACC的内容。我看了下dll的内容,有AsnInt AsnNull等简单类型的函数,竟然没有报错这个函数(AsnList)相关的定义。 我删除报错部分的函数定义,只保留声明部分,也是按照AsnInt的写法。理论上如果dll中有这个函数,就没问题,但目前看dll中是没有的,所以链接错误。 既然dll中没有函数定义,那我的工程中使用dllimport就很奇怪,但是之前用vc6.0就可以编译成功。可是现在在VS2010中把类定义成dllexport 或者 删除dllimport 也都存在链接问题。 头疼头疼,难道这个问题无解吗?大侠,如果帮忙解决了这个问题,我在加分给您。
buyong 2013-06-17
  • 打赏
  • 举报
回复
you should define SNACCDLL_EXPORTS first
赵4老师 2013-06-17
  • 打赏
  • 举报
回复
盲目升级”是码农之殇!

64,648

社区成员

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

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