Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio VS6.0中的LNK2019错误->;VS2013迁移的MFC DLL项目_Visual Studio_Visual C++_Visual Studio 2013_Linker Errors_Msdn - Fatal编程技术网

Visual studio VS6.0中的LNK2019错误->;VS2013迁移的MFC DLL项目

Visual studio VS6.0中的LNK2019错误->;VS2013迁移的MFC DLL项目,visual-studio,visual-c++,visual-studio-2013,linker-errors,msdn,Visual Studio,Visual C++,Visual Studio 2013,Linker Errors,Msdn,在尝试将大型VS6.0 DLL项目构建/移植到VS2013(其中DLL模块依赖于其他DLL模块)时,出现以下链接错误。未定义函数的独特之处在于它使用CString参数,但问题可能比这更明显: error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall CTokenEx::Split(class ATL::CStringT<char,class StrTraitMFC_DLL

在尝试将大型VS6.0 DLL项目构建/移植到VS2013(其中DLL模块依赖于其他DLL模块)时,出现以下链接错误。未定义函数的独特之处在于它使用CString参数,但问题可能比这更明显:

error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall CTokenEx::Split(class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > >,class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > >,class CStringArray &,int)" (__imp_?Split@CTokenEx@@QAEXV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@0AAVCStringArray@@H@Z) referenced in function "public: bool __thiscall OptionFlag::isTestEnableByFlag(class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > >)" (?isTestEnableByFlag@OptionFlag@@QAE_NV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@@Z)
当然,我需要再次三次检查我是否正在阅读这个确切的.exp/.lib,这是/Verbose告诉我的

在这种特殊情况下,我遇到的所有问题都是DLL“x”引用DLL“y”中的函数的情况,该函数有一个CTokenEx::Split()函数,该函数具有CString参数。我原以为问题是CSTring MFC vs ATL声明(见下面的链接),现在我不太确定,所以在这里发布后,我将回到第一步。(也就是说,我是不是漏掉了一个打字错误?是吗?)

我已经做了以下工作来隔离问题 生成属性:

  • 已验证所有模块均使用MBCS(多字节字符集)而不是Unicode
  • 通过“在DLL中使用MFC”验证所有模块是否正在生成
  • 使用/Verbose和Verbose:lib运行链接器,以验证链接器是否引用了我期望的链接文件
  • 使用dumpbin.exe检查导出的符号装饰,查看它们是否正在导出。(我想是的,但我不是垃圾桶专家)
  • 找到这些可能相关的链接:
    并尝试对CString类型的dllimport进行硬编码。
    关于MFC和CRT CSTring定义。不是100%确定这就是问题所在。(可能是我在争论中遗漏了什么。)
  • 包括“afxstr.h”和强制-D“_MFC_DLL_BLD”
  • 我正在使用的DLL模块的CTokenEx部分似乎来自,但我尚未确认。目前,我不确定这是否相关

    我只是想确认我对dumpbin.exe的分析是否准确,它告诉我这些符号是正确导出的。我认为这可能是一个链接顺序问题,第二次将DLL引用到链接器,但这没有帮助。在过去的生活中,曾在SunOs(远古时代)处理过类似的链接器问题

    如果我弄明白了这个问题,我会发布这个问题的答案。

    !啊! 在排除所有其他选项后。 尽管使用/Verbose和/Verbose:lib会显示*.lib文件的位置,并确认它们已找到,但您必须注意! 在我的例子中,相对于解决方案工作区,“.”中有一些VS6.0陈旧的*.lib文件,链接器首先找到了这些文件,当然它们可能没有正确地修饰符号。 如果链接器告诉您它已链接到:
    mylib.lib 而不是
    path\to\Mylib.lib 这是一条主要线索:)

    所以。。。我认为这是一个复杂而奇怪的链接器问题。这是一个好主意!啊!易链接器问题

    问题解决了,就这么简单。

     00000148  DIR32NB                    00000000        20  $N00027
     00000094  DIR32NB                    00000000        4F  ?Split@CTokenEx@@QAEXV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@0AAVCStringArray@@H@Z (public: void __thiscall CTokenEx::Split(class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > >,class ATL::CStringT<char,class StrTraitMFC_DLL<char,class ATL::ChTraitsCRT<char> > >,class CStringArray &,int))
     0000014C  DIR32NB                    00000000        21  $N00028
    
         3E30 ?Split@CTokenEx@@QAEXV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@0AAVCStringArray@@H@Z
         3E30 __imp_?Split@CTokenEx@@QAEXV?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@0AAVCStringArray@@H@Z