1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 链接报error LNK: unresolved external symbol错误 解决

链接报error LNK: unresolved external symbol错误 解决

时间:2020-01-29 02:46:28

相关推荐

链接报error LNK: unresolved external symbol错误 解决

/aiding_001/blog/static/2290819102224344450/

某次编写一个COM组件,接口定义好之后,增加了ZRX代码后编译链接,出现如下错误提示,百思不得其解。 error LNK: unresolved external symbol "public: enum Zcad::ErrorStatus __thiscall ZcDbDatabase::readDwgFile(char const *,int,bool,wchar_t const *)" (?readDwgFile@ZcDbDatabase@@QAE?AW4ErrorStatus@Zcad@@PBDH_NPB_W@Z) referenced in function "public: __thiscall ZwPdmAppSvr::ZwPdmAppSvr(char const *,bool)" (??0ZwPdmAppSvr@@QAE@PBD_N@Z) 寻遍百度谷歌大体的答案也就是库未包含或者配置不一致(其实这个问题根本上也是配置与ZRX库的配置不一致造成的)。但是肯定不是库包含的问题,因为其他的接口调用正常,唯独这个接口报链接错误。 如何定位是那个配置项呢?网上没有直接的答案,只好自己动手。 想来想去,应该还是连接器无法再lib中找到调用的函数,那么不如看看调用的函数在SDK中的声明: Zcad::ErrorStatus readDwgFile(const ZCHAR* fileName, const int shmode = _SH_DENYWR, bool bAllowCPConversion = false, const wchar_t* wszPassword = NULL); 的确有这个函数的声明,那问题在哪里呢? 无奈之下看到了这个函数的修饰名: ?readDwgFile@ZcDbDatabase@@QAE?AW4ErrorStatus@Zcad@@PBDH_NPB_W@Z 不 如到ZRX.dll中去找找看有没有这个导出函数。用DEPENDS.EXE打开ZRX.dll,将所有导出函数拷贝到记事本中,然后查 找?readDwgFile@ZcDbDatabase@@QAE?AW4ErrorStatus@Zcad@@PBDH_NPB_W@Z,居然真的找不 到这个函数(不可能啊)。然后查找一下相似的函数,发现有一个函数与这个函数非常之相 似?readDwgFile@ZcDbDatabase@@QAE?AW4ErrorStatus@Zcad@@PBDH_NPBG@Z。 会不会就是这个函数呢? 用undname.exe还原一下这两个函数的声明试试。 C:\Program Files\Microsoft Visual Studio 9.0\VC>undname.exe ?readDwgFile@ZcDbDatabas e@@QAE?AW4ErrorStatus@Zcad@@PBDH_NPBG@Z Microsoft (R) C++ Name Undecorator Copyright (C) Microsoft Corporation. All rights reserved. Undecoration of :- "?readDwgFile@ZcDbDatabase@@QAE?AW4ErrorStatus@Zcad@@PBDH_NPB G@Z" is :- "public: enum Zcad::ErrorStatus __thiscall ZcDbDatabase::readDwgFile(char const *,int,bool,unsigned short const *)" C:\Program Files\Microsoft Visual Studio 9.0\VC>undname.exe ?readDwgFile@ZcDbDatabas e@@QAE?AW4ErrorStatus@Zcad@@PBDH_NPB_W@Z Microsoft (R) C++ Name Undecorator Copyright (C) Microsoft Corporation. All rights reserved. Undecoration of :- "?readDwgFile@ZcDbDatabase@@QAE?AW4ErrorStatus@Zcad@@PBDH_NPB _W@Z" is :- "public: enum Zcad::ErrorStatus __thiscall ZcDbDatabase::readDwgFile(char const *,int,bool,wchar_t const *)" 细心的朋友一定已经发现,这两个函数其实就是同一个函数,差别就在最后一个参数上。这是由于编译器选项的不同导致连接器认为这两个函数不同。ZRX.dll中将wchar_t认为是自定义类型,编译后自动将其转换为unsigned short; 而我的工程中wchar_t设置为内置类型,按照这个类型得到的函数修饰名自然就与ZRX.lib中的函数名不同了,当然也就无法链接这个函数了。 真相终于大白,迅速打开工程设置,C/C++>Language将Treat wchar_t as Built-in Type设置为No (/Zc:wchar_t-)。 重新编译工程,链接通过,OK搞定。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。