【问题标题】:Linker Errors C++ Visual Studio 2005链接器错误 C++ Visual Studio 2005
【发布时间】:2008-10-27 18:06:52
【问题描述】:

对于我什至不直接调用的方法,我在 Visual Studio 中遇到了一大堆链接器错误。我白天是一名 Java 开发人员,但我有一个需要用 C++ 完成的项目,旨在在 Windows 机器上运行。因此,我被困在 Visual Studio 上。

Bascally,我有一个操作系统项目,我添加了一个访问器方法。我将该项目编译为 .lib 文件(编译和链接很好)。

然后我有自己的项目使用该库。我已将库包含在 Project->Properties -> Linker -> Input 下,并在 General -> Additional Lib Directories 中设置适当的目录。我已将标头包含在适当的文件中,我只是调用其中一个类的构造函数……甚至没有调用我创建的方法。

代码可以编译,但我得到以下大量链接器错误——主要是 LNK2019 和 LNK2001 错误。我尝试在不同的设置(lib、exe 等)下重新编译,链接器错误似乎只会成倍增加。当我切换回以前的设置时,错误数量仍处于峰值。任何想法如何解决这个问题?

构建日志

构建开始:项目:SpamCapture,配置:Debug|Win32

命令行:

使用内容创建临时文件“c:\SpamCapture\SpamCapture\SpamCapture\Debug\RSP0000103081740.rsp” [ /VERBOSE:LIB /OUT:"C:\SpamCapture\SpamCapture\SpamCapture\Debug\SpamCapture.exe" /INCREMENTAL /LIBPATH:"C:\SpamCapture\Config\Debug\" /MANIFEST /MANIFESTFILE:"Debug\SpamCapture.exe .intermediate.manifest" /NODEFAULTLIB:"libcmtd.lib" /NODEFAULTLIB:"nafxcwd.lib" /DEBUG /PDB:"c:\SpamCapture\SpamCapture\SpamCapture\Debug\SpamCapture.pdb" /SUBSYSTEM:CONSOLE /MACHINE:X86 KeyCapture_Config.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

".\Debug\Interaction.obj"

".\Debug\InteractionSet.obj"

".\Debug\LogReader.obj"

".\Debug\SpamCapture.obj"

".\Debug\stdafx.obj"

".\Debug\SpamCapture.res"

".\Debug\SpamCapture.exe.embed.manifest.res" ] 创建命令行“link.exe @c:\SpamCapture\SpamCapture\SpamCapture\Debug\RSP0000103081740.rsp /NOLOGO /ERRORREPORT:PROMPT”

输出窗口:

正在链接... LINK:警告 LNK4067:不明确的入口点;选择'mainCRTStartup' 搜索库 搜索 C:\SpamCapture\Config\Debug\KeyCapture_Config.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\lib\kernel32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\lib\uuid.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\odbc32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\odbccp32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\lib\msvcprtd.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\lib\MSVCRTD.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\mfc80ud.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\mfcs80ud.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atlsd.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\wininet.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib: 搜索 C:\SpamCapture\Config\Debug\KeyCapture_Config.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\lib\kernel32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\lib\uuid.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\odbc32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\odbccp32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\lib\msvcprtd.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\lib\MSVCRTD.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\lib\OLDNAMES.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\mfc80ud.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\mfcs80ud.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\msimg32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comctl32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shlwapi.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\atlmfc\lib\atlsd.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\wininet.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ws2_32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\mswsock.lib: 搜索 C:\SpamCapture\Config\Debug\KeyCapture_Config.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\lib\kernel32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\user32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\gdi32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\winspool.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\comdlg32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\advapi32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\shell32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\ole32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\oleaut32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\lib\uuid.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\odbc32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\lib\odbccp32.lib: 搜索 C:\Program Files\Microsoft Visual Studio 8\VC\lib\msvcprtd.lib: 完成搜索库

链接器错误从这里开始:

KeyCapture_Config.lib(KeyCapture_ConfigDlg.obj) : 错误 LNK2001: unresolved external 符号“公共:虚拟 int __thiscall CWnd::Create(char const *,char const *,unsigned long,struct tagRECT const &,class CWnd *,unsigned int,struct CCreateContext *)" (?Create@CWnd@@UAEHPBD0KABUtagRECT@@PAV1@IPAUCCreateContext@@@Z)

...更像这样的一堆

KeyCapture_Config.lib(KeyCapture_ConfigDlg.obj):错误 LNK2019:未解析的外部 符号 "public: struct HICON__ * thiscall CWinApp::LoadIconA(unsigned int)const " (?LoadIconA@CWinApp@@QBEPAUHICON@@I@Z) 在函数“public: __thiscall”中引用 CKeyCapture_ConfigDlg::CKeyCapture_ConfigDlg(类 CWnd *)" (??0CKeyCapture_ConfigDlg@@QAE@PAVCWnd@@@Z)

...更多类似的

(?DoDataExchange@SetupDialog@@MAEXPAVCDataExchange@@@Z) C:\SpamCapture\SpamCapture\SpamCapture\Debug\SpamCapture.exe : 致命错误 LNK1120: 34 unresolved externals

结果:

构建日志保存在“file://c:\SpamCapture\SpamCapture\SpamCapture\Debug\BuildLog.htm” SpamCapture - 44 个错误,1 个警告

【问题讨论】:

    标签: c++ visual-studio-2005 linker visual-c++-2005


    【解决方案1】:

    KeyCapture_Config.lib 正在使用 MFC GUI 类(CWndCWinApp 等),但您将其链接到的应用程序是控制台应用程序(请参阅链接器命令行中的 /SUBSYSTEM:CONSOLE 选项)。这行不通。您应该创建一个新的 MFC GUI 应用程序项目并将库添加到该项目。

    编辑:我刚刚检查了您评论中的链接:http://dynamicnetservices.com/~will/academic/textinput/keycapture/,看来 KeyCapture_Config 实际上是一个使用 KeyCapture DLL 的 MFC 对话框应用程序。通过直接链接KeyCapture.lib,可以在控制台应用程序中使用 KeyCapture。

    【讨论】:

      【解决方案2】:

      链接错误似乎是在抱怨缺少很多 MFC 功能,并且您的链接行包括:/NODEFAULTLIB:"nafxcwd.lib" 这将排除 MFC。您要链接的库是用 MFC 构建的吗?

      要检查的其他事项是您正在使用相同的字符集(即多字节或均 unicode)编译应用程序和库。

      当您构建一个库时,没有链接步骤,因此可以将任意对象集合放入库中,而无需考虑它们可能需要什么。

      【讨论】:

      • 实际上,我将 libcmtd.lib 和 nafxcwd.lib 设置为忽略,因为我收到了许多 LNK2005 错误。请参阅:错误 LNK2005:“public: virtual void __thiscall CWnd::PreSubclassWindow(void)”(?PreSubclassWindow@CWnd@@UAEXXZ) 已在 mfc80ud.lib(MFC80UD.DLL) 中定义
      • 了解 nafxcwd 的链接请求的来源总是很有帮助的。为什么应用程序认为它需要链接它 - 正如 Scott 所说,听起来组件是根据不同的 CRT 或 MFC 设置构建的。
      【解决方案3】:

      看起来您的项目正在与调试多线程运行时链接。这是你的意图吗?如果是这样,可能与您似乎正在使用的 KeyCapture_Config 库不一致。

      KeyCapture_Config 是第 3 方库吗?如果是这样,您是从源代码构建它还是为您提供了 lib/dll?

      可能只需要对正在构建的 C/C++ 运行时进行一些调查。您可以参考Microsoft KB Article,这可能有助于了解可能的运行时构建差异。

      【讨论】:

      【解决方案4】:

      我认为 Rob Walker 已经解决了这个问题。如果 KeyCapture_Config.lib 的文档说没有与 MFC 的链接,请检查需要链接到 MFC 的指令的源。像这样的:

      #pragma comment(lib, "nafxcwd.lib")
      

      会导致对 MFC 的依赖,并且 KeyCapture_Config.lib 文档可能已过期。

      【讨论】:

        猜你喜欢
        • 2011-08-26
        • 1970-01-01
        • 2010-11-05
        • 2014-10-17
        • 2013-12-27
        • 1970-01-01
        • 2011-04-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多