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

时间:2017-06-06 20:59:52

标签: visual-studio visual-c++ visual-studio-2013 linker-errors msdn

尝试将LARGE 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)

这是导出符号的模块的dumpbin.exe(来自* .exp文件):

 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

这是* .lib文件中的转储,我在* .lib文件中看到了__imp_。

     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

当然,我需要再次检查我是否正在阅读这个完全 .exp / .lib,这是/ Verbose告诉我的。

在这种特殊情况下,我遇到的所有问题都是DLL&#34; x&#34;引用DLL中的函数&#34; y&#34;它有一个CTokenEx :: Split()函数,它有CString参数。我认为问题是CSTring MFC vs ATL声明(见下面的链接),现在我不太确定,所以我在这里发布后回到原点。 (也就是我错过了一个错字?DOH?)

我已完成以下操作以隔离问题 建造物业:

  1. 已验证所有模块均使用MBCS(多字节字符集)而不是Unicode
  2. 已验证所有模块正在构建&#34;在DLL中使用MFC&#34;
  3. 使用/ Verbose和Verbose:lib运行链接器以验证链接器是否引用了我期望的链接文件。
  4. 使用dumpbin.exe检查导出的符号装饰以查看它们是否已导出。 (我认为他们是,但我不是垃圾箱专家)。
  5. 找到这些可能相关的链接:
    MSDN LNK2019 error并尝试对CString类型的dllimport进行硬编码 关于MFC和CRT CSTring定义的link。不是100%肯定这是问题。 (可能是我在论证中遗漏的东西。)
  6. 包括&#34; afxstr.h&#34;,并强制-D&#34; _MFC_DLL_BLD&#34;
  7. 我正在使用的DLL模块的CTokenEx部分似乎来自here,但我还没有确认。目前,我不确定这是否相关。

    我只是在寻找确认,我对dumpbin.exe的分析告诉我符号输出正确是准确的。我认为这可能是链接顺序问题,并且第二次将链接引用到链接器,但这并没有帮助。在过去的生活中,在SunOs中有类似的连接器问题(早在古代)。

    如果我想出这个问题,我会回答这个问题。

1 个答案:

答案 0 :(得分:0)

!DOH! 在您取消所有其他选项后。 。 虽然使用/ Verbose和/ Verbose:lib会显示* .lib文件的位置,并确认它们已找到,但您必须注意! 就我而言,&#34;中有一些VS6.0 STALE * .lib文件。&#34;相对于解决方案工作区和链接器首先找到了这些,当然他们可能没有正确装饰符号。 如果链接器告诉您它链接在:
MYLIB.LIB 而不是 的路径\到\ MYLIB.LIB 它是主要的线索:)。

Sooo ......我认为这是一个复杂的&amp;奇怪的连接问题。是啊!DOH!简单的链接器问题。

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