2008-10-27 150 views
2

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

Bascally,我有一个os项目,我添加了一个存取方法。我将该项目编译为.lib文件(编译并链接正常)。

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

代码编译,但我得到以下山链接器错误 - 主要是LNK2019和LNK2001错误。我试过在不同的设置(lib,exe等)下重新编译,并且链接器错误似乎只是繁殖。当我切换回以前的设置时,错误的数量仍然保持在最高点。任何想法如何解决这一问题?

生成日志

构建开始:项目:SpamCapture,配置:调试|的Win32

命令行:

创建临时文件“C:\ SpamCapture \ SpamCapture \ SpamCapture \ Debug \ RSP0000103081740.rsp“与内容 [ /VERBOSE:LIB /OUT:"C:\SpamCapture\SpamCapture\SpamCapture\Debug\SpamCapture.e xe“/ 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

“\调试\ Interaction.obj”

“\调试\ InteractionSet.obj”

”。 \ Debug \ LogReader.obj“

“\调试\ SpamCapture.obj”

“\调试\ StdAfx.obj的”

“\调试\ SpamCapture.res”

”。\调试\ SpamCapture.exe.embed .manifest.res” ] 创建命令行 “LINK.EXE @c:\ SpamCapture \ SpamCapture \ SpamCapture \调试\ RSP0000103081740.rsp/NOLOGO/ERRORREPORT:提示”

输出窗口:

链接... 链接:警告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 \ Micr osoft 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: \ 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 \ UUI d.lib: 正在搜索C:\ Program Files \ Microsoft Visual Studio 8 \ VC \ PlatformSDK \ lib \ odbccp32.lib:\ Program Files \ Microsoft Visual Studio 8 \ VC \ PlatformSDK \ lib \ odbc32.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: 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 \ Plat搜索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 \ advapi32.lib中搜索C:\ Program Files \ Microsoft Visual Studio 8 \ VC \ PlatformSDK \ lib \ comdlg32.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:\ P搜索Files \ Microsoft Visual Studio 8 \ VC \ PlatformSDK \ lib \ odbc32.lib: 正在搜索C:\ Program Files \ Microsoft的Visual Studio 8 \ VC \ LIB \ msvcprtd.lib: 完成搜索库

链接器错误从这里开始:

KeyCapture_Config.lib(KeyCapture_ConfigDlg.obj):错误LNK2001:无法解析的外部 符号“ public:virtual int __thiscall CWnd :: Create(char const *,char const *,unsigned long,struct tagRECT常量&,一流的CWnd *,无符号整型,结构CCreateContext *)” (?创建@ CWnd的@@ UAEHPBD0KABUtagRECT @@ PAV1 @ IPAUCCreateContext @@@ Z)

...一堆更喜欢这个

KeyCapture_Config.lib(KeyCapture_ConfigDlg.obj):错误LNK2019:无法解析的外部 符号? “市民:结构HICON__ * thiscall的CWinApp :: LoadIconA(无符号整数)常量” (LoadIconA @ CWinApp的@@ QBEPAUHICON @@ I @ Z)在函数“public:__thiscall CKeyCapture_Confi gDlg :: CKeyCapture_ConfigDlg(类的CWnd *)” (?? 0CKeyCapture_ConfigDlg @@ QAE @ PAVCWnd @@@ Z)

...一大堆更多类似这样的

(?DoDataExchange中@ SetupDialog @@ MAEXPAVCDataExchange @@@ Z) C:\ SpamCapture \ SpamCapture \ SpamCapture \ Debug \ SpamCapture。EXE:致命错误LNK1120:34层无法解析的外部

结果:

生成日志保存在 “file:// C:\ SpamCapture \ SpamCapture \ SpamCapture \调试\ BuildLog.htm” SpamCapture - 44个错误,1个警告

回答

5

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。

1

链接错误似乎抱怨缺乏大量的MFC功能,和你链接线包括:/NODEFAULTLIB:"nafxcwd.lib”这会排除MFC。你用MFC构建的链接库?

要检查的其他事情是,您正在编译应用程序和lib具有相同的字符集(即多字节或两个unicode)。

当您构建一个lib时,没有链接步骤,因此可以将任意的对象集合抛入到lib中,而不必考虑它们可能需要的其他东西。

+0

实际上,我将libcmtd.lib和nafxcwd.lib设置为忽略,因为我收到了一些LNK2005错误。请参阅: 错误LNK2005:已在mfc80ud.lib(MFC80UD.DLL)中定义的“public:virtual void __thiscall CWnd :: PreSubclassWindow(void)” (?PreSubclassWindow @ CWnd @@ UAEXXZ) – Gopherkhan 2008-10-27 18:39:05

+0

了解什么是然后是nafxcwd的链接请求的来源。为什么应用程序认为它需要链接它 - 正如斯科特所说,它听起来像组件构建的CRT或MFC设置不同。 – 2008-10-27 18:54:57

0

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

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

它可能只是需要调查哪些C/C++运行时正在构建。您可以参考Microsoft KB Article,这可能有助于揭示可能的运行时构建差异。

0

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

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

会导致依赖于MFC,并且KeyCapture_Config.lib文档可能已过时。