none
VS2010:error LNK2001: 无法解析的外部符号 "void __cdecl std::_Xlen(void)" (?_Xlen@std@@$$FYAXXZ) RRS feed

  • 问题

  • 背景介绍:

         本人手中有客户提供的源码,功能是用 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
    2013年5月5日 14:45

答案

  • 你好,

    欢迎来到这里。

    1. 确定您的lib文件中void __cdecl std::_Xran(void)函数有正确的实现部分,还有外部引用的正确添加。
    2. 如果您是迁移project的话,建议您新建一个新的project并编译生成lib文件,再进行引用。
    3. 您可以用一个简单的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.

    2013年5月6日 4:19
    版主
  • 检查你的项目属性,是否使用了正确的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锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2013年5月6日 9:11

全部回复

  • 综合所有的编译错误,大致分为以下几项:

    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

    2013年5月5日 14:49
  • 论坛上有人以前提问过相似的问题:http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/5ac28a31-3339-4db1-90f4-68edad360309

    小弟没看明白,求指点。

    最好给出解决办法,解决方向也行。

    TKS!

    2013年5月5日 14:50
  • 你好,

    欢迎来到这里。

    1. 确定您的lib文件中void __cdecl std::_Xran(void)函数有正确的实现部分,还有外部引用的正确添加。
    2. 如果您是迁移project的话,建议您新建一个新的project并编译生成lib文件,再进行引用。
    3. 您可以用一个简单的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.

    2013年5月6日 4:19
    版主
  • 检查你的项目属性,是否使用了正确的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锁屏而烦恼,赶紧下载这个 百变锁屏 应用,让你的锁屏不断地变化起来。

    2013年5月6日 9:11