积极答复者
VS2010:error LNK2001: 无法解析的外部符号 "void __cdecl std::_Xlen(void)" (?_Xlen@std@@$$FYAXXZ)

问题
-
背景介绍:
本人手中有客户提供的源码,功能是用 ANSI C++ + WDk 实现对 USB 的枚举,读写等,但是由于客户编写的程序源码有些乱,又是控制台程序,公司希望改写程序,并将程序可视化。
我的做法:
1、新建 C++/CLI 窗体程序,根据要求规划出界面;
2、新建C++/CLI 类库,将 USB driver 部分封装成 usbdev.lib 文件,OK;
3、再次新建C++/CLI类库,使用 #pragmat comment 命令引入 usbde.lib,并同时添加其相应的头文件,在新的类库中,建立与usbdev.lib 中一对一的类,用于封装,编译 失败。
编译器报告错误如下:
警告 1 warning LNK4068: 未指定 /MACHINE;默认设置为 X86 J:\0503-桌面\OMAPFlash\usbdev\LINK
警告 2 warning LNK4221: 此对象文件未定义任何之前未定义的公共符号,因此任何耗用此库的链接操作都不会使用此文件 J:\0503-桌面\OMAPFlash\usbdev\.NETFramework,Version=v4.0.AssemblyAttributes.obj
警告 3 warning LNK4221: 此对象文件未定义任何之前未定义的公共符号,因此任何耗用此库的链接操作都不会使用此文件 J:\0503-桌面\OMAPFlash\usbdev\AssemblyInfo.obj
警告 4 warning LNK4049: 已导入本地定义的符号 ??_7SerialDrv@@6B@ (const SerialDrv::`vftable') J:\0503-桌面\OMAPFlash\UsbDriver\usbdev.lib(serialdriver.obj)
错误 5 error LNK2020: 无法解析的标记(0A0002ED) "void __cdecl std::_Xran(void)" (?_Xran@std@@$$FYAXXZ) J:\0503-桌面\OMAPFlash\UsbDriver\Stdafx.obj
错误 6 error LNK2028: 无法解析的标记(0A000054) "void __cdecl std::_Xran(void)" (?_Xran@std@@$$FYAXXZ),该标记在函数 "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::erase(unsigned int,unsigned int)" (?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@$$FQAEAAV12@II@Z) 中被引用 J:\0503-桌面\OMAPFlash\UsbDriver\MgPortEnumerator.obj
错误 7 error LNK2028: 无法解析的标记(0A000252) "void __cdecl std::_Xran(void)" (?_Xran@std@@$$FYAXXZ),该标记在函数 "public: class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > & __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::erase(unsigned int,unsigned int)" (?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@$$FQAEAAV12@II@Z) 中被引用 J:\0503-桌面\OMAPFlash\UsbDriver\usbdev.lib(Stdafx.obj)
错误 8 error LNK2028: 无法解析的标记(0A0002F4) "void __cdecl std::_Xlen(void)" (?_Xlen@std@@$$FYAXXZ),该标记在函数 "[T2M] protected: virtual void __thiscall std::bad_exception::_Doraise(void)const " (__t2m@?_Doraise@bad_exception@std@@MBEXXZ) 中被引用 J:\0503-桌面\OMAPFlash\UsbDriver\Stdafx.obj
错误 9 error LNK2028: 无法解析的标记(0A000092) "void __cdecl std::_Xlen(void)" (?_Xlen@std@@$$FYAXXZ),该标记在函数 "private: bool __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Grow(unsigned int,bool)" (?_Grow@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@$$FAAE_NI_N@Z) 中被引用 J:\0503-桌面\OMAPFlash\UsbDriver\MgPortEnumerator.obj
错误 10 error LNK2028: 无法解析的标记(0A000259) "void __cdecl std::_Xlen(void)" (?_Xlen@std@@$$FYAXXZ),该标记在函数 "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::assign(char const *)" (?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@$$FQAEAAV12@PBD@Z) 中被引用 J:\0503-桌面\OMAPFlash\UsbDriver\usbdev.lib(Stdafx.obj)
错误 11 error LNK2019: 无法解析的外部符号 "void __cdecl std::_Xlen(void)" (?_Xlen@std@@$$FYAXXZ),该符号在函数 "private: bool __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Grow(unsigned int,bool)" (?_Grow@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@$$FAAE_NI_N@Z) 中被引用 J:\0503-桌面\OMAPFlash\UsbDriver\MgPortEnumerator.obj
错误 12 error LNK2001: 无法解析的外部符号 "void __cdecl std::_Xlen(void)" (?_Xlen@std@@$$FYAXXZ) J:\0503-桌面\OMAPFlash\UsbDriver\Stdafx.obj
错误 13 error LNK2001: 无法解析的外部符号 "void __cdecl std::_Xlen(void)" (?_Xlen@std@@$$FYAXXZ) J:\0503-桌面\OMAPFlash\UsbDriver\usbdev.lib(Stdafx.obj)
错误 14 error LNK2019: 无法解析的外部符号 "void __cdecl std::_Xran(void)" (?_Xran@std@@$$FYAXXZ),该符号在函数 "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::erase(unsigned int,unsigned int)" (?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@$$FQAEAAV12@II@Z) 中被引用 J:\0503-桌面\OMAPFlash\UsbDriver\MgPortEnumerator.obj
错误 15 error LNK2001: 无法解析的外部符号 "void __cdecl std::_Xran(void)" (?_Xran@std@@$$FYAXXZ) J:\0503-桌面\OMAPFlash\UsbDriver\Stdafx.obj
错误 16 error LNK2001: 无法解析的外部符号 "void __cdecl std::_Xran(void)" (?_Xran@std@@$$FYAXXZ) J:\0503-桌面\OMAPFlash\UsbDriver\usbdev.lib(Stdafx.obj)
错误 17 error LNK2001: 无法解析的外部符号 __CorDllMain@12 J:\0503-桌面\OMAPFlash\UsbDriver\LINK
错误 18 error LNK1120: 9 个无法解析的外部命令 J:\0503-桌面\OMAPFlash\Release\UsbDriver.dll- 已移动 Lisa Zhu 2013年5月23日 2:47 C++ related
答案
-
你好,
欢迎来到这里。
- 确定您的lib文件中void __cdecl std::_Xran(void)函数有正确的实现部分,还有外部引用的正确添加。
- 如果您是迁移project的话,建议您新建一个新的project并编译生成lib文件,再进行引用。
- 您可以用一个简单的project来单独测试您的lib文件,看是否出现这种无法解析的外部符号的问题。
此致
Elegentin Xie
MSDN Community Support | Feedback to us
Develop and promote your apps in Windows Store
Please remember to mark the replies as answers if they help and unmark them if they provide no help.- 已标记为答案 Elegentin XieModerator 2013年5月23日 2:53
-
检查你的项目属性,是否使用了正确的toolset, Configuration Properties>General>Platform Toolset
编译的平台是否对应 Win32 or x64?
检查项目的外部依赖文件,是否包含了std的内容。
错误发生在Link阶段,所以还需检查你的项目是否需要特别指定一些Link的静态库。 还有是否需要定义所需要的标记 Configuration Properties>C/C++>Preprocessor
Bob Bao
Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。- 已标记为答案 Elegentin XieModerator 2013年5月23日 2:53
全部回复
-
综合所有的编译错误,大致分为以下几项:
1、 error LNK2001: 无法解析的外部符号 "void __cdecl std::_Xlen(void)
2、error LNK2019: 无法解析的外部符号 "void __cdecl std::_Xran(void)" (?_Xran@std@@$$FYAXXZ),该符号在函数 "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::erase(unsigned int,unsigned int)" (?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@$$FQAEAAV12@II@Z) 中被引用 J:\0503-桌面\OMAPFlash\UsbDriver\MgPortEnumerator.obj
3、error LNK2028: 无法解析的标记(0A000092) "void __cdecl std::_Xlen(void)" (?_Xlen@std@@$$FYAXXZ),该标记在函数 "private: bool __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Grow(unsigned int,bool)" (?_Grow@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@$$FAAE_NI_N@Z) 中被引用 J:\0503-桌面\OMAPFlash\UsbDriver\MgPortEnumerator.obj
4、error LNK2001: 无法解析的外部符号 __CorDllMain@12 J:\0503-桌面\OMAPFlash\UsbDriver\LINK
-
论坛上有人以前提问过相似的问题:http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/5ac28a31-3339-4db1-90f4-68edad360309
小弟没看明白,求指点。
最好给出解决办法,解决方向也行。
TKS!
-
你好,
欢迎来到这里。
- 确定您的lib文件中void __cdecl std::_Xran(void)函数有正确的实现部分,还有外部引用的正确添加。
- 如果您是迁移project的话,建议您新建一个新的project并编译生成lib文件,再进行引用。
- 您可以用一个简单的project来单独测试您的lib文件,看是否出现这种无法解析的外部符号的问题。
此致
Elegentin Xie
MSDN Community Support | Feedback to us
Develop and promote your apps in Windows Store
Please remember to mark the replies as answers if they help and unmark them if they provide no help.- 已标记为答案 Elegentin XieModerator 2013年5月23日 2:53
-
检查你的项目属性,是否使用了正确的toolset, Configuration Properties>General>Platform Toolset
编译的平台是否对应 Win32 or x64?
检查项目的外部依赖文件,是否包含了std的内容。
错误发生在Link阶段,所以还需检查你的项目是否需要特别指定一些Link的静态库。 还有是否需要定义所需要的标记 Configuration Properties>C/C++>Preprocessor
Bob Bao
Do you still use the same Windows 8 LockScreen always? Download Chameleon Win8 App quickly, that changes your LockScreen constantly.
你是否还在看着一成不变的Windows 8锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。- 已标记为答案 Elegentin XieModerator 2013年5月23日 2:53